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 и получите много бесплатного пива;-)

Писание может занять немного больше времени, чем предложенный вами взлом, но, вероятно, оно того стоит.

Другие вопросы по тегам