【问题标题】:Difference between /topic, /queue for SimpleMessageBroker in Spring Websocket + SockJSSpring Websocket + SockJS 中 SimpleMessageBroker 的 /topic、/queue 之间的区别
【发布时间】:2016-10-17 15:40:39
【问题描述】:

如果我使用“简单代理”,Spring Websocket + SockJS 的 /topic、/queue 等有什么区别?例如。这里Sending message to specific user on Spring Websocket 说:当您的客户端订阅以 /user/ 开头的频道时,例如:/user/queue/reply,您的服务器实例将订阅名为 queue/reply-user 的队列[会话 ID]

我想以某种清晰的方式理解这种转换背后的逻辑。

【问题讨论】:

    标签: java spring stomp spring-websocket sockjs


    【解决方案1】:

    你应该看看this part of the reference documentation。 简而言之,"/topic""/queue" 都是配置到同一个目标的前缀。

    在文档中,"/app" 是配置的“应用程序目标前缀” - 这意味着所有通过 "clientInboundChannel" 流入并匹配这些前缀的消息都将映射到您的应用程序,例如使用 @MessageMapping 注释。

    同样,"/topic""/queue" 都是配置为 STOMP 目标的前缀 - 这意味着所有通过 "clientInboundChannel" 流入并匹配这些前缀的消息都将转发到 STOMP 代理。在您的情况下,这就是简单的代理实现。

    因此,从 Spring Websocket 的角度来看,"/queue""/topic" 的处理方式相同,并且是“典型的”STOMP 目的地——所有匹配这些的消息都被转发到消息代理。现在,如果您使用的是完整的消息代理实现,那么这些目标可能具有不同的含义,并且消息代理的行为可能会有所不同。以下是Apache ApolloRabbitMQ 的一些示例。

    请注意,如果您愿意,可以更改这些前缀。但我建议您将这些保留为默认值,除非您真的知道自己在做什么。

    【讨论】:

    • 您能否评论一下,/topic 和 /queue 之间的实际区别是什么?现在还不清楚,我应该使用它们中的任何一个还是可以自己弥补。
    • 我已经更新了我的答案。对于简单的消息代理,它根本没有区别。但我已经明确表示,对于真正的消息代理(如果您需要部署应用程序的多个实例),这些目的地可能有不同的含义。
    【解决方案2】:

    我认为该主题的最佳答案是 Spring Docs 中的以下内容

    目的地的含义在 STOMP 中故意不透明 规格。 可以是任何字符串,这完全取决于 STOMP 服务器 定义他们的目的地的语义和语法 支持。 但是,目的地类似路径是很常见的 字符串,其中“/topic/..”表示发布-订阅(一对多)和 “/queue/”意味着点对点(一对一)的消息交换。

    【讨论】:

      【解决方案3】:

      上面的答案中没有提到更大更重要的区别。

      主题是自动删除的,而队列是持久的。这意味着当 websocket 连接关闭时,主题及其数据将被删除。在队列中,服务器仍然可以发送消息,当客户端通过 websocket 连接时,它会接收服务器发送的旧消息。

      顺便说一下,内存代理没有区别。使用专用代理时会发生这种情况。

      【讨论】:

      • 能否请您添加对相关文档的引用?
      • docs.spring.io/spring-framework/docs/5.0.0.M4/… 文档说““/topic”和“/queue”前缀取决于正在使用的代理”和“检查代理的 STOMP 页面以查看它支持的目标语义”。我提到的答案是针对 RabbitMQ。不知道其他券商是不是也这样。
      猜你喜欢
      • 2018-04-06
      • 1970-01-01
      • 2015-07-24
      • 2021-08-27
      • 2016-07-04
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多