Взаимодействие мастер процесса и воркеров в nodejs?
Добрый вечер!
Хотел спросить про обмен сообщениями между мастером и воркерами в NodeJS.
Зачем мне это?
Например, у меня есть чат на websockets, и при многопоточном режиме, например с модулем cluster, клиенты теряются и это очевидно.
Я не хочу использовать Redis или аналогичную базу данных, а хотел бы сделать это с встроенными средствами NodeJS.
В NodeJS есть возможность общаться между процессами.
СОБСТВЕННО ВОПРОС:
Когда клиент подключается то текущий воркер отправляет мастеру сокет объект клиента, а мастер закидывает этого клиента в свой глобальный объект, а потом отправляет этот объект обратно текущему воркеру. А если у меня онлайн 10k клиентов, то тогда при подключении других клиентов отправляется очень большой объект с 10k клиентами, плохо ли это? Лучше ли это, чем использования например Redis?
redis с его механизмом pub/sub будет проще, быстрее и удобнее
А так, общаться между воркером и мастером можно
самое простое - это через встроенное в child_process/cluster ipc - тормознуто, но работает без лишних заморочек
вариант посложнее - tcp/upd/unix сокет
Спасибо за ответ, еще хотел спросить: в модуле cluster есть понятия Master и Worker. process.send - воркер отправляет сообщение мастеру, worker.send - мастер отправляет сообщение воркеру, process - это воркер, а worker.send - это что мастер? а почему тогда не master.send?
Я рекомендую все же TCP, потому, что на стандартном IPC решение не будет масштабируемым, его нельзя будет размазать на несколько серверов. А если у Вас не стоит задача подключать много клиентов, например, будет 10-50к подключений, то это и один процесс может обработать, тут даже кластера из мастера/воркера не нужно, это очень маленькие цифры. Один сервер может потянуть до 2-3млн соединений даже (в зависимости от интенсивности обмена, конечно). Я не понял фразу "клиенты теряются и это очевидно", не понятно, куда теряются и это не очевидно. И еще вот примеры мои дам, которые я студентам на лабы даю по IPC и TCP: https://github.com/HowProgrammingWorks/InterProces...
Ну если я храню в оперативной памяти клиентов (сокет соединений), то они теряются, т.к в многопоточном режиме, процессы меняются же и если первый процесс хранил одного пользователя, то второй процесс который начал работу из за балансировки будет хранить другого пользователя а не первого и этого, вот что я имел ввиду, спасибо за ответ
ILE -Salim если воркер падает и его нужно перезапустить, то лучше всего, чтобы каждый воркер восстанавливал свое состояние из БД или из файла при старте. Передавать большой массив пользователей из мастер-процесса тоже можно, но тогда нужно хранить его в мастер-процессе для всех воркеров, а это может быть очень много. Ну и мастер тоже может падать, так нельзя положиться на то, что состояние будет надежно сохранено в нем, без БД или файлов не обойтись. В общем, по поводу падений процессов, нужно все так делать, чтобы они поменьше утекали и падали, это не нормально, когда процессы постоянно перезапускаются.