繁体   English   中英

JMS主题与队列 - 意图

[英]JMS Topic vs Queue - Intent

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

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

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

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

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

如果您根据实际示例考虑,何时使用队列的设计要求很简单:

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

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

  • 新闻广播给多个用户; 通知服务,股票代码等
  • 电子邮件客户端(独特的持久订阅者;当您断开连接时仍然会收到电子邮件)

你说...

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

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

你说...

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM