2015-02-19 2 views
2

У меня есть приложение, которое использует Express как ориентированную на пользователя инфраструктуру для моего REST API, а также RabbitMQ для вызовов функций, подобных RPC, в кластерный бэкэнд. Кроме того, я использую Q, чтобы обещать всю свою рабочую нагрузку в Маршрутах.Стратегия разгрузки для более длительных задач в экспресс-маршрутах

В одном из маршрутов, которые я использую, я запускаю некоторые функции, которые сканируют URL-адрес, указанный в параметрах маршрута, выполняет поиск по GeoIP, нормализует форматы результатов и т. Д. Это может занять несколько секунд в зависимости от времени ответа отсканированные URL-адреса серверов.

То, что я хотел бы достичь, заключается в том, что пользователь, который отправляет новый URL-адрес для обхода, получает немедленную обратную связь с его запросом (статус 200 = «Обходной запрос подтвержден»), и не имеет запроса, ожидающего завершения обхода ,

Мои идеи либо

  • Отправка URL в определенной очереди в RabbitMQ, и есть другой способ, чтобы слушать на работу очереди по
  • Используя что-то вроде дочерних процессов внутри Маршруты Экспресс

Что было бы лучшим решением для решения этой проблемы? Спасибо за ваш ценный вклад.

ответ

3

Очень загруженный вопрос с множеством опций, каждый из которых имеет свои собственные воздействия на общую систему. Не уверен, есть ли ответ . Это действительно вопрос предпочтения и того, с чем вам комфортно. ИМО, я постараюсь, чтобы все было просто. Добавление другого процесса (RabbitMQ) означает другой пакет программного обеспечения (или даже весь сервер) для управления, настройки, разрешения и безопасности.

Несколько вещей, чтобы рассмотреть. Является ли основная часть обрабатываемых операций ввода-вывода привязана или связана с ЦП? Если вы используете удаленный сервис для выполнения запросов GeoIP, это может быть больше ограничений ввода-вывода, которое идеально подходит для узла. Почему бы не иметь узел просто обрабатывать все через:

process.nextTick(function() { 
    // Do your lookup here 
} 

res.status(201).end(); 

Затем используйте что-то вроде socket.io отправить результаты клиенту асинхронно?

В любом случае, я бы рекомендовал возвращающую 202 - Accepted, а не 200.

+1

Большое спасибо за ваш ответ. Я уже использую RabbitMQ, главным образом, для вызовов функций RPC для базового кластера, поэтому добавление другого сервиса/сервера не является проблемой. Дело в использовании другой очереди с RabbitMQ было бы в том, что мне нужно будет запустить другой процесс для прослушивания соответствующей очереди. В настоящее время обход выполняется в функции RPC, которая затем возвращает результаты сканирования. Это оказалось нежизнеспособным из-за времени отклика. Мне действительно нравится 'process.nextTick (function() {});' idea и проверит это ... – Tobi

+1

Btw, это 202 Accepted :-) Спасибо за этот намек. – Tobi

+0

Woah, не могу поверить, что я толкнул его. Оригинал обновлен. – barefootsanders

Смежные вопросы