У меня есть приложение, которое использует Express как ориентированную на пользователя инфраструктуру для моего REST API, а также RabbitMQ для вызовов функций, подобных RPC, в кластерный бэкэнд. Кроме того, я использую Q, чтобы обещать всю свою рабочую нагрузку в Маршрутах.Стратегия разгрузки для более длительных задач в экспресс-маршрутах
В одном из маршрутов, которые я использую, я запускаю некоторые функции, которые сканируют URL-адрес, указанный в параметрах маршрута, выполняет поиск по GeoIP, нормализует форматы результатов и т. Д. Это может занять несколько секунд в зависимости от времени ответа отсканированные URL-адреса серверов.
То, что я хотел бы достичь, заключается в том, что пользователь, который отправляет новый URL-адрес для обхода, получает немедленную обратную связь с его запросом (статус 200 = «Обходной запрос подтвержден»), и не имеет запроса, ожидающего завершения обхода ,
Мои идеи либо
- Отправка URL в определенной очереди в RabbitMQ, и есть другой способ, чтобы слушать на работу очереди по
- Используя что-то вроде дочерних процессов внутри Маршруты Экспресс
Что было бы лучшим решением для решения этой проблемы? Спасибо за ваш ценный вклад.
Большое спасибо за ваш ответ. Я уже использую RabbitMQ, главным образом, для вызовов функций RPC для базового кластера, поэтому добавление другого сервиса/сервера не является проблемой. Дело в использовании другой очереди с RabbitMQ было бы в том, что мне нужно будет запустить другой процесс для прослушивания соответствующей очереди. В настоящее время обход выполняется в функции RPC, которая затем возвращает результаты сканирования. Это оказалось нежизнеспособным из-за времени отклика. Мне действительно нравится 'process.nextTick (function() {});' idea и проверит это ... – Tobi
Btw, это 202 Accepted :-) Спасибо за этот намек. – Tobi
Woah, не могу поверить, что я толкнул его. Оригинал обновлен. – barefootsanders