Чтобы создать канал интеграции Spring, поскольку Spring WebSocket не поддерживает обмен сообщениями для клиента, не являющегося топом

Поскольку мы не используем Stomp для нашего сервера websocket, spring не предлагает структуру брокера сообщений. Мое видение состоит в том, чтобы использовать паб / подписку Spring для обмена сообщениями с хранилищем сообщений Redis для разработчиков и перенести брокер сообщений с Redis на SQS + Dynamo для версии prod.

Как я исключаю (поскольку ios и Android не готовы поставить клиент Stomp на передний план из-за отсутствия поддержки) Stomp, библиотека spring websocket также не включает функцию pub / sub.

Пример нашего бизнес-кейса:

Каждый подключенный сеанс веб-сокета будет инициировать запрос к другому микросервису (который является клиентом веб-сокета Java) для получения данных. Мое видение состоит в том, чтобы соединить эти два сервиса через архитектуру pub / sub с Redis.

  1. Мобильный клиент отправляет -> «Привет, мой счет оплачен?» через веб-сокет.
  2. Сервер WebSocket получает это сообщение и передает его клиентской службе WebSocket через redis pub / sub.
  3. Поскольку сервер websocket и клиент Websocket подключаются через Redi pub / sub. Они могут обмениваться сообщениями.
  4. Клиент Websocket будет подключен к системе агентов-людей через сокет и передаст «Привет, мой счет оплачен?».
  5. Ответ («Да, платно») будет снова опубликован на сервере websocket.
  6. Сервер Websocket отправит его обратно определенному пользователю.

По коммерческим причинам мы хотели бы сохранить 2 сервиса для этого варианта использования. Клиент Websocket может подключаться к системе агента клиента и не связан с нашей бизнес-логикой. Наши мобильные приложения будут взаимодействовать с нашим собственным сервером websocket. Это дает нам возможность добавлять дополнительные настройки и независимо от конкретного поставщика.

Вот мой способ обхода

  1. Используйте spring-websocket без топания для создания сервера Websocket.
  2. Используйте Spring-Integration для создания архитектуры обмена сообщениями.
  3. Каждый сеанс веб-сокета привязан к каналу интеграции Spring и отправляет ответ в конкретное место назначения.
  4. Создайте очередь запросов / ответов Redis для каждого соединения.
  5. Канал интеграции Spring подписывается в очередь Redis.

Поскольку наша инфраструктура не поддерживает Rabbit MQ, очередь Redis будет заменена SQS в продукте.

Вопрос: Можем ли мы создать каналы весенней интеграции во время выполнения и привязать их к определенной службе или очереди? Мысленный процесс состоит в том, чтобы предлагать один канал для каждого сеанса веб-сокета и удалять канал по окончании сеанса.

Есть ли лучшее альтернативное решение, доступное в Spring интеграции или Spring Messaging для выполнения этого варианта использования?


person Dhanavenkatesh    schedule 23.07.2019    source источник


Ответы (1)


См. Java Потоки динамической интеграции DSL и интеграции во время выполнения.

Вы можете регистрировать и уничтожать подпотоки по запросу.

Сохраните ссылку на динамически зарегистрированный идентификатор потока и вызовите remove() в контексте.

Интеграция Spring имеет встроенный Websocket поддержка на основе Spring Framework.

person Gary Russell    schedule 24.07.2019
comment
Спасибо. Я работаю над вашим предложением. У меня есть ссылка от вас на github github.com / весенние-проекты / весенние-интеграционные-образцы / дерево /. webSocketOutboundAdapter Не возвращает данные клиенту. Я использовал клиент chrome websocket. Процесс интеграции работает, и сообщение маршрутизируется правильно, но не возвращается клиенту браузера. Следует ли использовать адаптер TCPOutbound для маршрутизации сообщений в клиентский браузер или службу? - person Dhanavenkatesh; 29.07.2019
comment
Не задавайте новых вопросов в комментариях; вместо этого задайте новый вопрос, показывающий ваш код и конфигурацию. - person Gary Russell; 29.07.2019