Вводные
Есть приложение на nodejs которое слушает веб-сокет. При получении сообщений, в зависимости от содержимого, запускаются следующие модули (1) в которых начинается прослушка своих сокетов. В каждом таком модуле происходит много http запросов к апи. Вычислений сложных в целом нет, никаких сортировок или прям блокирующих операций нет (только в некоторых местах встречаются for() циклы, в которых внутри await, но такие функции запускаются асинхронно)
Т.е. можно понять, что одно из самых узких мест - сеть.
Node и другие сервисы (redis, mysql...) крутятся в докере в своих контейнерах
Сам node скрипт запускается через forever, что бы перезапускаться при краше.
Данные между этими подпроцессами передавать не нужно. Но вот получить данных из родительского процесса хотелось бы (но можно и через редис все устроить, если это действительно нужно)
Цель
Я хочу разделить все эти подпроцессы (т.е. запуски модулей (1)) в отдельные потоки, что бы они крутились на отдельных ядрах, что бы быстрее выполнялись и не мешались друг другу в event loop (на сколько я понимаю, у каждого процесса он будет свой).
В итоге повысить производительность и задействовать всю мощность сервера.
Вопрос
- Имеет ли вообще смысл в моем случае использовать распараллеливание или все равно все упирается в сеть и я не добьюсь быстродействия? (с учетом что операция сложных нет, но их многовато)
- Если это все крутится в докере, он же сам умеет в многопоточность, верно?
- Влияет ли как то на многопоточность forever (можно и на pm2 переехать, но пока хватало forever)
- Ну и главный вопрос. Если все таки имеет смысл в распараллеливании, что лучше использовать? child_process, Worker_threads, cluster. На сколько я понимаю, мне лучше всего подходит cluster, т.к. не нужно общаться между дочерними потоками, но желательно иметь связь с родительским потоком.
- И еще момент. Если крешнится какой-либо дочерний поток, это приведет к крешу всего приложения и других потоков или же родительский процесс так и продолжить работать запуская новые дочерние?