Node.js primus websocket кластеризация
Опробовав большинство движков веб-сокетов, я пришел к выводу, что лучший способ - использовать Primus (универсальный упаковщик для сред реального времени), чтобы иметь возможность протестировать любую инфраструктуру веб-сокетов, которая может возникнуть, без изменения моей функциональности.
Несмотря на то, что Primus делает то, что говорит, я оказался в ситуации, в которой хотел масштабироваться.
Primus имеет много плагинов, и два из них: primus-cluster и primus-redis-rooms. Это те два, которые используют Redis pub-sub для масштабирования, когда у вас много узловых процессов. Проблема, с которой я столкнулся с обоими плагинами, заключается в том, что я не могу отправить сообщение на отдельный сокет - spark . Это означает, что искры не сохраняются - передаются в Redis, чтобы каждый процесс знал, сколько всего искр.
У кого-нибудь есть идеи как это реализовать?
1 ответ
Проблема с комнатами primus-redis и primus-redis заключается в том, что вещание осуществляется только с одного сервера, а не с одного сервера сообщений.
Что касается взлома номеров, который вы предлагаете, это "нормальная" альтернатива, но это определенно взлом и дает много накладных расходов. Я не думаю, что это так сложно создать плагин, который:
- добавляет spark.id в redis (spark.id -> адрес сервера) для каждого соединения, которое оно принимает.
- удаляет spark.id из redis при разрыве соединения.
- добавляет паб / подканал (адрес сервера) для сервера, чтобы он мог получать сообщения.
- Заставить этот канал прослушивать сообщения с помощью spark.ids, найти искры на сервере Primus и записать сообщение.
- напишите метод, который находит spark.id в redis, чтобы он знал адрес сервера и отправлял на канал сообщение PUBLISH с сообщением, которое необходимо записать вместе с spark.id.
- опубликуйте модуль на npm и получите много бесплатного пива;-)
Писание может занять немного больше времени, чем предложенный вами взлом, но, вероятно, оно того стоит.