6

我试图了解使用队列的用例。

我的理解:队列是一对一的意思。唯一的用例(如果不是罕见的话,非常少)是:消息仅用于一次消费。

但即使在这些情况下,我也可能想使用主题(只是为了将来安全)。唯一额外的谨慎是使订阅持久。或者,在特殊情况下,我会使用桥接/调度机制。

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

请让我知道我在这里缺少什么或者我缺少最初的意图?

4

3 回答 3

6

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

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

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

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

你说...

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

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

你说...

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

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

于 2013-07-03T04:01:34.437 回答
0

JMS 中的队列和主题代表两种不同的模型——点对点和发布/订阅。主题将保留一条消息,直到所有客户端都收到它们,所有订阅者都在处理它们。队列将等待第一个消费者拉取消息,并认为此时它已被读取。

于 2013-07-02T17:02:45.247 回答
0

您可能错过了队列和主题都可以有多个订阅者。队列将消息传递给可能的多个订阅者之一,而主题将消息传递给所有订阅者。

如果您确定只有一个订阅者,那么队列订阅者和持久主题订阅者的行为将相似。我宁愿将这种情况视为“特例”。

于 2013-07-02T15:33:44.610 回答