Задать вопрос

Как вы относитесь к короткоживущим процессам в NodeJS?

Собственно, есть ли у кого-нибудь позитивный опыт использования подобной архитектуры?
Если есть негативный, то тоже интересно послушать. В каких ситуациях была попытка внедрить подобное и почему отказались.
  • Вопрос задан
  • 331 просмотр
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Staltec
@Staltec
Node.js разработчик
Создавать новый процесс для обработки пользовательского запроса, по-сути является шагом назад к протоколу CGI. Это будет медленно и накладно по ресурсам. Собственно поэтому и появился протокол FastCGI, чтобы сократить время отклика за счёт постоянно живущего процесса.

Безотносительно архитектуры приложения, ответить на ваш вопрос сложно. С одной стороны Node рассчитан на долгую жизнь процесса, по крайней мере головного. С другой стороны, реализация web-worker, запуск побочных процессов через spawn и даже в некоторых случаях воркеры в кластере (cluster) вполне могут быть короткоживущими для выполнения разовых задач.

В общем надо плясать от вашей задачи. Очень интересно, что именно заставило вас думать в эту сторону.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Расскажу, какая ситуация с этим у меня в Impress и что меня в этом устраивает и не устраивает.

Сейчас процессы для обработки запросов порождаются при старте, и повторно порождаются при падении. Утечки памяти или падения процессов - считаю ненормальным поведением, но в реальности не все используемые библиотеки пушу я и даже не весь код приложений пишу я, поэтому нужно как-то с утечками и падениями бороться. Конечно падения минимизированны, т.к. весь прикладной код выполняется в sandbox`ах, и при утечках можно просто создать новый sandbox в том же процессе, восстановить в нем все нужные структуры данных, потом заменить ссылку со старого (утекшего или испорченного при исключении sandbox`а) на новый и убить старый. Это быстрее, чем порождать новый процесс.

Но иногда хочется ответвить обработку одного запроса в отдельный процесс, чтобы он не мешал другим. Сейчас у меня реализовано прозрачное для приложений порождение нового процесса для этих случаев, т.е. сделано нечто подобное воркерам. Но процессы запускаются относительно медленно. Кроме того, есть еще планировщик заданий, который должен выполнять часть бизнес-логики по расписанию.

Как я хочу сделать. Кроме процессов обработки запросов иметь еще некоторый пул подготовленных запущенных процессов, которые уже и соединение к БД установили и развернули все что нужно в памяти. С родительским процессом они связаны TCP-сокетом, через который налажен RPC (полноценный вызов удаленных процедур с поддержкой колбэков, событий, асинхронного вызова нескольких запросов и т.д.) И когда возникает необходимость ответвить обработку или выполнить задание по расписанию, то вместо порождения процесса будет браться первый свободный процесс из пула и ему по RPC приходит заказ. Когда он все выполнил, то он по RPC возвращает колбэк или событие.

Вот все у меня уже вроде готово для этого и сам RPC написан и отлажен, скоро реализую. А дальше по тому же RPC (но с транспортом через вебсокеты) собираюсь связать и клиентские приложения, чтобы они становились единым целым с серверными процессами и воркерами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы