Масштаб Socket.io по вертикали и по горизонтали - каков "правильный" способ?

Я хочу масштабировать мое приложение Node.js Socket по вертикали и по горизонтали, и я еще не нашел сложного решения.

Мое приложение имеет два варианта использования:

  • Широковещательные сообщения от одного пользователя ко всем остальным
  • Push-сообщения от одного пользователя к подмножеству пользователей

С одной стороны, я прочитал, что мне нужен Redis для обоих случаев вместе с socket.io-redis

С другой стороны, я смотрел это видео и читал этот ответ SO, где говорится, что Redis не является надежным и не гарантирует, что опубликованные сообщения будут отправлены, поэтому вы должны использовать его только для кластеризации/вертикальное масштабирование

Решение Microsoft Azures для использования ServiceBus не может быть и речи, потому что я не хочу использовать Azure.

Вместо Redis парень рекомендует использовать RabbitMQ для горизонтального масштабирования.

Для вертикального масштабирования также существует socket.io-clusterhub, IPC для процессов node, но он работает только на Socket.io <= v0.9.0

Тогда есть этот парень, который внедрил свой собственный метод для передачи сообщений другим узлам по HTTP-запросам, что как-то имеет смысл. Но почему HTTP-запросы, если вы также можете установить прямые соединения сокетов между серверами, одновременно нажимать сообщение на все серверы и преодолевать задержку перехода с одного сервера на другой?


В качестве вывода я подумал, может быть, я могу пойти с Redis на КАЖДОМ сервере, просто для обмена сообщениями при кластеризации моего приложения на нескольких процессах вместе с RabbitMQ как a S2S.

Но похоже, что у него есть один Redis для сервера и другой центральный RabbitMQ.

Есть ли какое-нибудь известное более короткое/лучшее решение для надежного масштабирования Socket.io в обоих направлениях?


EDIT: Я попытался использовать один Redis Server для нескольких серверов Node.js, где каждый из них использует кластеризацию через sticky-session поверх всех сердечники. Хотя Clustering по своему усмотрению работает как шарм с redis, кажется, что проблема связана с использованием нескольких серверов. Сообщения не попадут в другие узлы.

Ответы

Ответ 1

Я бы сказал, что Kafka подходит для горизонтального масштабирования. Это довольно сложный способ распределения огромного количества событий на серверах (которые в конце - это то, что вы хотите). Об этом хорошо сказано: https://engineering.linkedin.com/kafka/running-kafka-scale

Что касается вертикальной шкалы, вместо socket.io-clusterhub я бы использовал нечто вроде PM2 (https://github.com/Unitech/pm2), которое позволяет изменять размер масштаб приложений на каждом компьютере динамически, а также управление журналами и отчетность в keymetrics.io(если вы используете его).

Если вам нужны какие-либо фрагменты, спросите меня, и я отредактирую ответ, но в PM2 github их будет довольно мало.