Доброго времени.
Возник вопрос реализации подобного приложения. Допустим у нас есть мастер процесс который следит за работой модулей, в случаи падения он возобновляет их работу и собственно записывает нужное в лог.
Первый модуль, обрабатывает запросы экспрессом, другой собирает системную информацию (запущенные процессы, нагрузка памяти и процессора). Третий вовсе обрабатывает запросы на отдельном порте.
Все эти модули тесно взаимосвязаны. Какими средствами раскидать эти модули на отдельные процессы и научить друг с дружкой общаться (ну помимо сокетов)?
Это не совсем то, что я ожидал. Модули не являются отдельными приложениями, они часть приложения. Может возможен вариант запуска кода отдельным worker'ом?
Андрей Менский: Идея с отдельными воркерами на мой взгляд не самая лучшая в силу природы node.js, но если уж хочется, то и для этих целей можно использовать zmq. Он поддерживает коммуникацию inproc.
Андрей Менский: На работе пришли к решению с rabbitmq, так как модули у нас выходили объемными и к тому же команда разработчиков разнородная, кто-то хорошо знает python, кто-то node.js или С++.
wing_pin: Ситуация начитает проясняться, спасибо. Остался один вопрос. Есть ли особенности разработки модуля работающий по средствам передачи сообщений через rabbitmq, если его запускать кластером на несколько worker'ов?
Андрей Менский: Один из плюсов rabbitmq - это то, что он сам заботится о распределении задач между воркерами, так же активно используем маршрутизацию сообщений. На хабре есть хороший цикл статей "RabbitMQ tutorial", где основные сценарии использования разобраны.
wing_pin: Возник такой вопрос. Есть ли возможность в RabbitMQ адресовать сообщения определенному процессу (воркеру). У меня есть роут в экспрессе, который отправляет сообщение в очередь. Другой сервис получая данное сообщение из очереди, анализирует и отвечает на него (replyTo). Проблема в том, если я запущу экспресс кластером, с опр. периодичностью ответ будет приходить не тому воркеру.
Была мысль выделять очередь каждому воркеру, но думаю это затратно. Читал урок по RabbitMQ RPC. Либо чего, не понял или всему вина конфиг exclusive: true для очереди.
Андрей Менский: Если нужно прям одному конкретному воркеру, то в таком случае RPC лучше использовать habrahabr.ru/post/236221 . Вообще нет ничего страшного в том, чтобы создавать множество анонимных очередей и гибко управлять маршрутизацией через топики как вот тут habrahabr.ru/post/201178 И вот еще такой вопрос, как долго может обрабатываться запрос к сервису? Если достаточно долго, то было бы неплохо организоваться отправку данных с сервера на клиент при завершении обработки запросов, например с помощью socket.io
Андрей Менский: Для каждого процесса, который выполняет RPC запросы создается уникальная очередь ответов от процесса, который обрабатывает запросы. Очередь RPC запрос одна, но процессов, которые берут из нее задания может быть множество. Если у вас будет 5 экземпляров Express, то будет 5 очередей для ответов экспресу и одна очередь, в которую будут поступать запросы.