JMS主题与队列


190

我想知道JMS队列和JMS主题之间有什么区别。

ActiveMQ页面

主题

在JMS中,主题实现发布和订阅语义。当您发布消息时,消息将发给所有感兴趣的订阅者-因此,零到许多订阅者将收到消息的副本。只有在代理接收消息时具有有效订阅的订阅者才能获得消息的副本。

Queue列

JMS队列实现负载均衡器语义。仅一位消费者将收到一条消息。如果在发送消息时没有可用的使用者,它将一直保留到可以处理该消息的使用者可用为止。如果某个消费者收到一条消息,但在关闭前未确认该消息,则该消息将重新发送给另一个消费者。队列中可以有许多使用者,而消息在各个使用者之间负载均衡

我想拥有某种“东西”,它将以与ActiveMQ代理接收消息的顺序相同的顺序向每个订阅者发送消息的副本。

有什么想法吗?

Answers:


145

这意味着一个主题是适当的。队列意味着一条消息发给一个,并且只有一个可能的订户。每个用户都有一个话题。


4
您知道JMS或WSO2 MB中的队列的负载平衡如何工作吗?
库拉桑加

这很有趣,因为我正在尝试调试一些订户,并且在发送主题时未调用该订户,但在发送至队列时它却起作用了
vmrvictor


29

JMS主题是目的地的分布的1对多的模型的类型。所有消费用户都收到相同的已发布消息。您也可以将其称为“广播”模型。您可以将主题视为与分布式计算的Observer设计模式中的Subject等效。一些JMS提供者有效地选择将其实现为UDP而不是TCP。对于主题而言,消息传递是“一劳永逸”的-如果没人听,消息就会消失。如果那不是您想要的,则可以使用“持久订阅”。

JMS队列是1对1的目的地的消息。该消息仅由使用之一接收(请注意:始终将订阅者用于“主题客户端”,对于队列客户端始终使用接收者,以避免混淆)。发送到队列的消息会存储在磁盘或内存中,直到有人捡起它或它过期为止。因此,队列(和持久订阅)需要一些主动的存储管理,因此您需要考虑慢速的使用者。

我认为,在大多数环境中,主题是更好的选择,因为您始终可以添加其他组件,而不必更改体系结构。添加的组件可能包括监视,日志记录,分析等。在项目开始时,您永远不会知道1年,5年,10年的需求是什么样的。变化是不可避免的,拥抱它:-)


26

就这么简单:

队列 =插入>提取(发送给单个订户)1:1

主题 =插入>广播(发送给所有订户)1:n

在此处输入图片说明


2
一个简单的社交网络就是一个例子。有人“喜欢”一个帖子。后端将“ POST LIKE”事件发布到该主题。它由3个订阅者使用:(notificationProcessor向发布者发送通知),karmaProcessor(向喜欢者和发布者提供业力),feedProcessor(向上推动人们的饲料)。当然都是异步的。
悉达多

@Siddhartha,这可能是一个示例,谢谢!
selem mn

8

至于订单保存,请参见此ActiveMQ页面。简而言之:为单个消费者保留订单,但是对于多个消费者,则不能保证交货顺序。


7

Queue列

优点

  • 具有透明通信流程的简单消息传递模式
  • 可以通过将消息放回到队列中来恢复消息

缺点

  • 只有一位消费者可以收到消息
  • 暗示生产者和消费者之间的耦合,因为它是一对一的关系

主题

优点

  • 多个消费者可以收到一条消息
  • 生产者和消费者之间的解耦(发布和订阅模式)

缺点

  • 更复杂的通讯流程
  • 无法为单个侦听器恢复消息

4

如果您有N个消费者,则:

JMS主题将消息传递到N个中的N个JMS队列将消息传递到N个中的1个

您说您“正在寻找一种“事物”,该事物将以与ActiveMQ代理收到消息的顺序相同的顺序向每个订阅者发送消息的副本。”

因此,您要使用主题,以便所有N个订阅者都获得消息的副本。


1

主题::主题是一对多的交流...(多点或发布/订阅)EX:-想象一个发布者在youtub中发布电影,然后其所有订阅者都将收到通知...。QUEVE :: queve是一对一的-一个通信...例如:-发布一个充值请求时,它将仅发送给一个qreciever ...始终记住如果请求转到所有qreceiver,则发生了多次充值,因此在开发适合应用程序的分析时


-1

队列是JMS托管对象,用于保存等待订户使用的消息。当所有订阅者都消费了该消息后,该消息将从队列中删除。

主题是发布消息时,主题的所有订阅者都收到相同的消息。


2
队列消息仅由单个使用者使用一次,这就是为什么队列实现负载均衡器的原因。主题订阅可以持久:订阅者可以在发布后很长时间接收消息(例如,如果订阅者被关闭并再次出现)。
格鲁伯(Gruber)2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.