JMS主题与队列

时间:2011-04-07 05:27:57

标签: jms activemq

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

ActiveMQ page

  

主题

     

在JMS中,主题实现发布和订阅语义。当您发布消息时,它会发送给所有订阅者   感兴趣的 - 所以零到多的订阅者都会收到一份   信息。只有当时有效订阅的订阅者   经纪人收到消息后会得到一条消息。

     

队列

     

JMS队列实现负载均衡器语义。一个消费者将收到一条消息。如果没有   消息发送时可用的消费者将保留   直到有消费者可以处理消息。如果一个   消费者在收到消息之前收到消息并且不会确认消息   然后该消息将被重新传递给另一个消费者。一个队列可以   让许多消费者在可用的消息中加载负载均衡   消费者。

我想要“东西”将以与ActiveMQ代理收到消息的顺序相同的顺序向每个订阅者发送消息副本。

有什么想法吗?

9 个答案:

答案 0 :(得分:116)

这意味着一个主题是合适的。队列意味着消息转发给一个且只有一个可能的订户。一个主题发送给每个订阅者。

答案 1 :(得分:45)

主题是发布者 - 订阅者模型,而队列是点对点的。

答案 2 :(得分:20)

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

JMS队列是消息的1对1目的地。消息仅由一个消费接收器接收(请注意:始终使用订阅者用于'主题客户端和接收器 for queue client's避免混淆)。发送到队列的消息存储在磁盘或内存中,直到有人拿起它或它过期。因此,队列(和持久订阅)需要一些主动存储管理,您需要考虑缓慢的消费者。

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

答案 3 :(得分:8)

关于订单保存,请参阅this ActiveMQ page。简而言之:订单是为单个消费者保留的,但是对于多个消费者来说,订单不能得到保证。

答案 4 :(得分:4)

很简单:

  

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

     

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

enter image description here

答案 5 :(得分:3)

如果您有N个消费者,那么:

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

你说你是"希望有一个''这将以与ActiveMQ代理接收消息的顺序相同的顺序向每个订阅者发送消息的副本。"

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

答案 6 :(得分:1)

TOPIC :: topic是一对多通信...(多点或发布/订阅) EX:-imagine发布者在youtub中发布电影然后所有订阅者都会收到通知.... QUEVE :: queve是一对一的沟通...... 例如: - 当发布充值请求时,它将只有一个qreciever ... 永远记住,如果请求转到所有qreceivers然后多次充电发生,所以在开发适合应用程序的分析时

答案 7 :(得分:1)

队列

优点

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

缺点

  • 只有一位消费者可以收到消息
  • 由于一对一关系暗示了生产者和消费者之间的耦合

主题

优点

  • 多个消费者可以收到一条消息
  • 生产者与消费者之间的脱钩(发布-订阅模式)

缺点

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

答案 8 :(得分:-1)

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

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

相关问题