Spring 5 Reactive WebSockets: рекомендуемое использование

Я немного узнал о Spring 5 WebFlux, реактивном программировании и веб-сокетах. Я смотрел Spring Tips: Reactive WebSockets with Spring Framework 5 Джоша Лонга. Код, который отправляет данные с сервера на клиент через соединение WebSocket, использует Spring Integration IntegrationFlow, который публикуется в PublishSubcribeChannel, на который подписан пользовательский MessageHandler, который принимает сообщение, преобразует его в объект, который затем преобразуется в Json и передается в FluxSink из обратного вызова, предоставленного Flux.create (), который используется для отправки в WebSocketConnection.

Мне было интересно, является ли использование IntegrationFlow и PublishSubscribeChannel рекомендуемым способом передачи событий из фонового процесса клиенту или это просто более удобно в данном конкретном примере (мониторинг файловой системы). Я бы подумал, если у вас есть контроль над фоновым процессом, вы могли бы передать его напрямую FluxSink?

Я думаю о вариантах использования, подобных следующему:

  • процесс машинного обучения, прогресс которого отслеживается
  • обновления состояния игрового мира, которые отправляются игрокам
  • чаты / программное обеспечение для совместной работы
  • ...

person herman    schedule 05.10.2017    source источник
comment
Мне тоже интересен ответ на этот вопрос. Reactor's Flux - это не шина сообщений, поэтому, возможно, поэтому Канал более уместен.   -  person Gorazd Rebolj    schedule 19.12.2017
comment
Я тоже очень заинтересован в ответе   -  person USS-Montana    schedule 17.08.2018


Ответы (2)


После этого вопроса Spring представила Поддержка RSocket - вы можете думать об этом как о поддержке WebSocket STOMP, существующей в Spring MVC, но гораздо более мощной и эффективной, поддерживающей обратное давление и расширенные шаблоны связи на уровне протокола.

Для упомянутых вами случаев использования я бы посоветовал использовать RSocket, поскольку вы получите мощную модель программирования с @MessageMapping и всей ожидаемой поддержкой Spring (кодеки для JSON и CBOR, безопасность и т. Д.).

person Brian Clozel    schedule 02.11.2019
comment
RSocket великолепен, поскольку он вводит сеть как первоклассного гражданина в реактивную парадигму. Однако RSocket и Websockets не исключают друг друга. RSocket - это протокол, работающий на TCP или Websockets. Протокол WebSocket работает на уровне 7 модели OSI, например HTTP / 2, а RSocket работает на уровне OSI 5/6. - person anataliocs; 02.12.2020
comment
к сожалению, клиент RSocket websocket для javascript в настоящее время находится только на версии 0.0.19 и ему уже 10 месяцев. см. npmjs.com/package/rsocket-websocket-client - person herman; 02.12.2020
comment
Сам Rsocket составляет всего 0,2 - person anataliocs; 03.12.2020

То, что я сделал в прошлом, помогло мне создать компонент Spring, реализующий WebSocketHandler:

@Component
public class ReactiveWebSocketHandler implements WebSocketHandler {

Затем в методе handle Spring внедряет объект WebSocketSession

@Override
public Mono<Void> handle(WebSocketSession session) {

Затем создайте один или несколько реактивных издателей Flux, которые отправляют сообщения (WebSocketMessage) для клиента.

    final var output = session.send(Flux.merge(flux1, flux2));

Затем вы можете заархивировать входящие и исходящие объекты Flux в Mono, и Spring возьмет его оттуда.

        return Mono.zip(incomingWebsocketMsgResponse.getWebSocketMsgFlux().then(),
                outputWithErrorMsgs)
                .then();

Пример: https://howtodoinjava.com/spring-webflux/reactive-websockets/

person anataliocs    schedule 01.12.2020