Разница между / topic, / queue для SimpleMessageBroker в Spring Websocket + SockJS

Есть ли пояснение, в чем разница между / topic, / queue и т. Д. Для Spring Websocket + SockJS, если я использую «простой брокер»? Например. здесь Отправка сообщения конкретному пользователю в Spring Websocket, говорится : когда ваш клиент подписывается на канал, начинающийся с / user /, например: / user / queue / reply, ваш экземпляр сервера подписывается на очередь с именем queue / reply-user [идентификатор сеанса]

Я хотел бы хоть как-то понять логику таких преобразований.


person Askar Ibragimov    schedule 16.06.2016    source источник


Ответы (3)


Вам следует взглянуть на эта часть справочной документации. Вкратце, "/topic" и "/queue" - оба префикса, настроенные для одного и того же назначения.

В документации "/app" - это настроенный «префикс назначения приложения» - это означает, что все сообщения, проходящие через "clientInboundChannel" и соответствующие этим префиксам, будут сопоставлены вашему приложению, например, с аннотациями @MessageMapping.

Здесь также "/topic" и "/queue" оба префикса настроены как места назначения STOMP - это означает, что все сообщения, проходящие через "clientInboundChannel" и соответствующие этим префиксам, будут перенаправлены брокеру STOMP. В вашем случае это простая реализация брокера.

Таким образом, с точки зрения Spring Websocket, "/queue" и "/topic" обрабатываются одинаково и являются "типичными" местами назначения STOMP - все сообщения, соответствующие им, пересылаются брокеру сообщений. Теперь, если вы используете полную реализацию брокера сообщений, эти места назначения могут иметь другое значение, и поведение брокера сообщений может быть другим. Вот несколько примеров с Apache Apollo и RabbitMQ.

Обратите внимание, что при желании вы можете изменить эти префиксы. Но я бы посоветовал вам оставить их по умолчанию, если вы действительно не знаете, что делаете.

person Brian Clozel    schedule 16.06.2016
comment
Не могли бы вы прокомментировать, в чем на самом деле будет разница между / topic и / queue? Сейчас непонятно, использовать ли я один из них или могу просто придумать свой. - person Askar Ibragimov; 21.06.2016
comment
Я обновил свой ответ. Для простого брокера сообщений это вообще не имеет значения. Но я ясно дал понять, что с реальными брокерами сообщений (если вам нужно развернуть несколько экземпляров вашего приложения) эти места назначения могут иметь разные значения. - person Brian Clozel; 21.06.2016

Я думаю, что лучшим ответом на эту тему будет следующее из Spring Docs

Значение пункта назначения намеренно оставлено непрозрачным в спецификации STOMP. Это может быть любая строка, и все серверы STOMP должны определять семантику и синтаксис поддерживаемых ими адресатов. Однако очень часто места назначения представляют собой строки, похожие на пути, где "/ topic / .." подразумевает подписку на публикацию (один-ко-многим), а "/ queue /" подразумевает двухточечный ( индивидуальный) обмен сообщениями.

person cleitonpqz    schedule 08.05.2018

Существует большая и важная разница, не упомянутая в ответах выше.

Тема удаляется автоматически, а очередь долговечна. Это означает, что когда соединение с веб-сокетом закрывается, тема и ее данные удаляются. в очереди сервер все еще может отправлять сообщения, и когда клиент подключается через веб-сокет, он получает старые отправленные сообщения сервером.

Кстати, в брокере in-memory разницы нет. Это происходит при использовании выделенного брокера.

person denizg    schedule 27.04.2020
comment
Не могли бы вы добавить ссылку на соответствующую документацию? - person Sergey; 24.09.2020
comment
docs.spring.io/spring-framework/docs/5.0.0.M4/ в документации говорится, что префиксы / topic и / queue зависят от используемого брокера. Проверьте страницу STOMP брокера, чтобы увидеть семантика назначения, которую он поддерживает. Ответ, который я упомянул, был для RabbitMQ. Не знаю, такие ли другие брокеры. - person denizg; 24.09.2020