Redis — максимальное количество подписок/подключений?

Я разрабатываю систему уведомлений в реальном времени и систему чата на основе Java Spring с использованием Redis и WebSockets (с sockJS и STOMP). Требуется, чтобы каждый пользователь подписался на уникальный канал (имя канала будет идентификатором пользователя). Это связано с тем, что уведомления могут быть нацелены на одного пользователя, а разговор в чате может вестись один на один. Сама причина, по которой я использую Redis, заключается в том, чтобы вызвать событие на соответствующем сервере приложений (их много), где пользователь подключен через WebSocket. Насколько я понимаю, когда публикация говорит «user1», и если я хочу, чтобы «обработчик onMessage» запускался только для этого целевого пользователя:

  1. Нужно ли мне поддерживать 1 соединение Redis для каждого пользователя?
  2. Можно ли одновременно открывать 15 тысяч подключений с 15 тысячами уникальных подписок для множества пользователей, подключенных к системе одновременно?

person user1102532    schedule 06.08.2017    source источник
comment
Как система узнает, к какому серверу приложений подключен пользователь, знает, что есть новое сообщение для пользователя или это то, о чем вы спрашиваете?   -  person goblinjuice    schedule 06.08.2017
comment
Система знает, потому что Redis запускает обработчик событий на соответствующем сервере приложений, к которому подключен пользователь. Скажем, пользователь-а подключен к серверу приложений-а, пользователь-б подключен к серверу приложений-б. Когда я публикую сообщение на канале, на который подписаны оба пользователя, Redis запускает событие на обоих серверах приложений, а в обработчике событий у меня есть код для отправки сообщения пользователю через веб-сокет, к которому подключен пользователь.   -  person user1220169    schedule 08.08.2017
comment
Моя проблема заключается в следующем. В сценарии, когда пользователь-а подписан на канал-а, а пользователь-б на канал-б, и оба они подключены к одному и тому же серверу приложений, мне нужно иметь 2 отдельных подключения к Redis для каждого пользователя. Так что, когда я публикую сообщение для пользователя-а, событие запускается только при соединении-а, где слушает eventHanler пользователя-а, а пользователь-б не получает это сообщение, поскольку он/она подключен через совершенно отдельное соединение. Мне нужно знать, хороший ли это подход.   -  person user1220169    schedule 08.08.2017
comment
Другой подход заключается в том, чтобы просто иметь 1 соединение для каждого сервера приложений, продолжать добавлять обработчики событий в одно и то же соединение Redis и подписываться на все каналы. В моем обработчике событий мне нужно проверить, предназначено ли сообщение для текущего пользователя, и отправить его только в случае истинности — игнорировать сообщение для других пользователей. Проблема в том, что все обработчики событий будут запущены. Но лучше ли это, чем иметь 1 подключение на пользователя? это то, что я пытаюсь понять   -  person user1220169    schedule 08.08.2017


Ответы (1)


Поскольку вы отметили вопрос Redisson, я предполагаю, что вы уже используете его. Если ваш выбор платформы WebSocket является гибким, т. е. не ограничивается SockJS с STOMP, вы можете рассмотреть netty- проект сокетио. Он написан автором Redisson, и интеграция между ними не может быть более естественной.

Netty-socketio полностью совместим с популярной клиентской JS-библиотекой SocketIO и используется многими компаниями в коммерческих целях.

Для этого не требуется одно соединение Redis для каждого пользователя, и есть люди, чье использование, как известно, уже превысило ваши требования.

Это упоминается в файле README проекта.

Отзывы клиентов в 2014 году:

Для стресс-тестирования решения мы запустили 30 000 одновременных клиентов веб-сокетов и смогли достичь максимальной скорости передачи около 140 000 сообщений в секунду со средней задержкой менее 1 секунды. (c) Виктор Эндерш - Kambi Sports Solutions

person Redisson_RuiGu    schedule 17.08.2017