我试图了解使用队列的用例。
我的理解:队列是一对一的意思。唯一的用例(如果不是罕见的话,非常少)是:消息仅用于一次消费。
但即使在这些情况下,我也可能想使用主题(只是为了将来安全)。唯一额外的谨慎是使订阅持久。或者,在特殊情况下,我会使用桥接/调度机制。
如上所述,我总是(或在大多数情况下)想要发布到一个主题。订阅者可以是持久主题或分派队列。
请让我知道我在这里缺少什么或者我缺少最初的意图?
我试图了解使用队列的用例。
我的理解:队列是一对一的意思。唯一的用例(如果不是罕见的话,非常少)是:消息仅用于一次消费。
但即使在这些情况下,我也可能想使用主题(只是为了将来安全)。唯一额外的谨慎是使订阅持久。或者,在特殊情况下,我会使用桥接/调度机制。
如上所述,我总是(或在大多数情况下)想要发布到一个主题。订阅者可以是持久主题或分派队列。
请让我知道我在这里缺少什么或者我缺少最初的意图?
如果您从实际示例的角度考虑,关于何时使用队列的设计要求很简单:
...以及何时使用主题的示例...
你说...
但即使在这些情况下,我也可能想使用主题(只是为了将来安全)。我必须做的唯一额外情况是使(每个)订阅持久。或者,我在特殊情况下,我会使用桥接/调度机制。
你过度设计了设计。确实,您可以使用主题和持久订阅者来实现一次性处理,但您将被限制为单个持久订阅者;当您为该主题启动另一个订阅者时,您将获得对同一消息的重复处理,更不用说,单个持久订阅者几乎不是可扩展的解决方案;这肯定会成为您系统的瓶颈。使用队列,您可以在 100 个节点上为同一个队列部署 1000 个接收器,并且您仍然可以获得对单个消息的一次性处理。
你说...
上面给出,我总是(或在大多数情况下)想要发布到一个主题。订阅者可以是持久主题或分派队列。
使用带有主题订阅者的调度队列有点多余。使用队列时,您基本上会获得异步调度,那么为什么不只使用队列呢?......没有理由在它前面放置一个主题。
JMS 中的队列和主题代表两种不同的模型——点对点和发布/订阅。主题将保留一条消息,直到所有客户端都收到它们,所有订阅者都在处理它们。队列将等待第一个消费者拉取消息,并认为此时它已被读取。
您可能错过了队列和主题都可以有多个订阅者。队列将消息传递给可能的多个订阅者之一,而主题将消息传递给所有订阅者。
如果您确定只有一个订阅者,那么队列订阅者和持久主题订阅者的行为将相似。我宁愿将这种情况视为“特例”。