JMS主题与队列 - 意图

San*_*dal 5 java jms message-queue publish-subscribe jms-topic

我试图了解使用Queue的用例.

我的理解:队列意味着一对一.唯一的用例(如果不罕见,很少)将是:消息仅用于一次消费.

但即使在这些情况下,我也可能想要使用Topic(只是为了将来安全).唯一需要特别注意的是使订阅持久.或者,在特殊情况下,我会使用桥接/调度机制.

鉴于上述情况,我总是(或在大多数情况下)想要发布主题.订阅者可以是持久主题或分派队列.

请让我知道我在这里缺少什么,或者我错过了原来的意图?

raf*_*ian 5

如果您从实际示例的角度考虑,关于何时使用队列的设计要求很简单:

  • 在线提交订单(只处理一次,避免刷卡两次)
  • 私人点对点聊天(每条消息只有一个接收器)
  • 并行任务分配(在网络系统中的许多工作人员之间分配任务)

...以及何时使用主题的示例...

  • 向多个订阅者广播新闻;通知服务、股票行情等。
  • 电子邮件客户端(唯一的持久订阅者;断开连接时仍会收到电子邮件)

你说...

但即使在这些情况下,我也可能想使用 Topic(只是为了将来安全)。我唯一需要做的就是让(每个)订阅持久化。或者,我在特殊情况下,我会使用桥接/调度机制。

你过度设计了设计。确实,您可以使用主题和持久订阅者实现一次处理,但您只能使用单个持久订阅者;当您为该主题启动另一个订阅者时,您将获得对同一消息的重复处理,更不用说,单个持久订阅者几乎不是可扩展的解决方案;这肯定会成为您系统中的瓶颈。使用队列,您可以在 100 个节点上为同一个队列部署 1000 个接收器,并且您仍然可以对单个消息进行一次处理。

你说...

上面给出,我总是(或在大多数情况下)想要发布到一个主题。订阅者可以是持久主题或分派队列。

使用带有主题订阅者的调度队列有点多余。使用队列时,您基本上会获得异步调度,那么为什么不只使用队列呢?...没有理由在它前面放置一个主题。