Масштаб 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 их будет довольно мало.