Верблюжий маршрут "до" определенной конечной точки веб-сокета
У меня есть несколько верблюжьих маршрутов с розетками мины и пристанью. Я могу передать сообщение всем клиентам, подключенным к веб-сокету, но как мне отправить сообщение определенной конечной точке. Как мне вести список всех подключенных клиентов с идентификатором клиента в качестве ссылки, чтобы я мог направить к конкретному клиенту. Это возможно? Смогу ли я упомянуть динамический клиент в URI?
Или, возможно, я думаю об этом неправильно, и мне нужно создавать темы на активных mq и сделать так, чтобы клиенты подписались на него. Это будет означать, что я создаю тему для каждого клиента websocket? и направьте сообщение в нужную тему.
Я хотя бы на правильном пути здесь, какие примеры вы можете указать? Гугл не помог.
2 ответа
Ваш подход зависит от того, насколько конфиденциальной является информация клиента. Недостатком одной темы с селекторами является то, что любой может подписаться на эту тему без селектора и видеть всю информацию для всех - обычно это не то, что вы хотите сделать.
Лучшая схема - использовать механизм распространения сообщений (набор маршрутов Camel), который действует как посредник между клиентами веб-сокетов и системой, производящей сообщения. Этот механизм отвечает за распространение сообщений из одного пункта назначения в определенные клиентом пункты назначения. Я работал над несколькими банковскими веб-интерфейсами, которые использовали похожую схему.
Чтобы это работало, вы сначала генерируете для каждого пользователя отдельный токен /UUID; это представляется пользователю, когда сеанс установлен (обычно через какой-то профиль / запрос профиля). Очень важно, чтобы UUID мог быть обработан как хеш-код clientId, а не сохранен в БД, так как он будет использоваться постоянно, и вы хотите убедиться, что это выполняется быстро.
Затем пользователь использует эту информацию для подключения к конкретным темам, которые используют этот UUID в качестве суффикса. Например, два пользователя подписались на orderConfirmation
каждая тема подписалась бы на свою версию этой темы:
clientA -> orderConfirmation.71jqsd87162iuhw78162wd7168
clientB -> orderConfirmation.76232hdwe7r23j92irjh291e0d
Чтобы отслеживать "присутствие", вашим клиентам необходимо периодически отправлять контрольные сообщения, содержащие их clientId, в известную тему, которую слушает ваш механизм распространения. Клиенты не должны иметь возможность подписаться на эту тему для чтения (см. Безопасность ActiveMQ). Механизм распределения сообщений должен хранить в памяти структуру данных, которая содержит clientId и время, когда пульс был в последний раз замечен.
Когда сообщение получено механизмом распространения, он проверяет, имеет ли clientID, для которого он получил сообщение, сеанс "живой / существующий", определяет UUID для клиента и передает сообщение по соответствующей теме.
Со временем это создаст большое количество тем на вашем брокере, которые вы не хотите, чтобы болтаться, когда пользователь ушел. Вы можете настроить ActiveMQ, чтобы удалить их, если они были неактивными в течение некоторого времени.
Вы определенно не хотите создавать отдельную конечную точку для каждого клиента. Тема и подписка с селектором - элегантный способ ее решения. Я бы сказал, лучший.
Вам нужна отдельная тема, на которую каждый клиент подписался бы с помощью селектора, похожего на where clientId in ('${myClientId}', 'EVERYONE')
, Теперь, когда вы хотите опубликовать сообщение конкретному клиенту, вы устанавливаете свойство clientId для идентификатора этого клиента. Если вы хотите транслировать, вы установите для него "ВСЕ"
Надеюсь, я правильно понял проблему...