Подтвердить что ты не робот

Как общаться с веб-и рабочими динамиками с помощью Node.js на Heroku?

Web Dynos может обрабатывать запросы HTTP

и в то время как Web Dynos обрабатывает их Worker Dynos может обрабатывать задания из него.

Но я не знаю, как сделать Web Dynos и Worker Dynos для связи друг с другом.

Например, я хочу получить HTTP-запрос Web Dynos

отправьте его Рабочим динамикам

обработать задание и отправить результат в Web Dynos

показать результаты в Интернете.

Возможно ли это в Node.js? (С RabbitMQ или Kue или т.д.)?

Я не смог найти пример в Документация Heroku

Или Должен ли я выполнять все коды в Web Dynos и масштабировать Web Dynos только?

4b9b3361

Ответ 1

Как показывает статья высокого уровня в фоновых заданиях и очередях, вашим веб-динозам необходимо будет общаться с вашими рабочими динамиками через промежуточный механизм (часто очередь).

Чтобы выполнить то, что звучит так, как вы надеетесь сделать, следуйте этому общему подходу:

  • Веб-запрос получает веб-дино
  • Web dyno добавляет задание в очередь
  • Оператор dyno получает задание с очереди
  • Рабочий дино выполняет задание, записывая постепенный прогресс в общий компонент
  • Запрос опроса на стороне браузера задает статус задания из веб-dyno
    • Web dyno запрашивает общий компонент для выполнения фонового задания и отправляет состояние обратно в браузер
  • Рабочий дино завершает выполнение задания и помечает его как полностью в общем компоненте
  • Запрос опроса на стороне браузера задает статус задания из веб-dyno
    • Web dyno запрашивает общий компонент для выполнения фонового задания и отправляет завершенное состояние обратно в браузер

Что касается фактической реализации, я не слишком хорошо знаком с лучшими библиотеками в Node.js, но компоненты, которые склеивают этот процесс вместе, доступны на Heroku как add -ons.

Очередь: AMQP - это хорошо поддерживаемый протокол очереди, а надстройка CloudAMQP может служить очередью сообщений между вашим веб-сервером и рабочими динамиками.

Общее состояние: вы можете использовать одну из надстроек Postgres для совместного использования состояния обрабатываемого задания или чего-то более эффективного, например Memcache или Redis.

Итак, чтобы суммировать, вы должны использовать промежуточный дополнительный компонент для обмена данными между динамиками на Heroku. Хотя этот подход включает в себя немного больше инженерии, результатом является правильно развязанная и масштабируемая архитектура.

Ответ 2

Из того, что я могу сказать, Heroku не предоставляет способ общения для вас, так что вам придется строить это самостоятельно. Чтобы связаться с другим процессом с помощью Node, вам, вероятно, придется иметь дело с процессом 'stdin/out/err вручную, что-то вроде этого:

var attachToProcess = function(pid) {
    return {
        stdin: fs.createWriteStream('/proc/' + pid + '/fd/0'),
        stdout: fs.createReadStream('/proc/' + pid + '/fd/1'),
        stderr: fs.createReadStream('/proc/' + pid + '/fd/2')
    };
};

var pid = fs.readFile('/path/to/worker.pid', 'utf8', function(err, pid) {
    if (err) {throw err;}
    var worker = attachToProcess(Number(pid));
    worker.stdin.write(...);
});

Затем в рабочем процессе вам нужно будет сохранить pid в этом файле pid:

fs.writeFile('/path/to/worker.pid', process.pid, function(err) {
    if (err) {throw err;}
});

Я на самом деле ничего не тестировал, поэтому, скорее всего, он будет работать и работать над этим, но я думаю, что основная идея понятна.

Изменить

Я только заметил, что вы отметили это как "redis", и подумали, что я должен добавить, что вы также можете использовать redis pub/sub для связи между вашими различными процессами, как описано в node_redis readme.