JMS主题与队列

Pol*_*uin 173 activemq-classic jms

我想知道JMS队列和JMS主题之间的区别.

它说,从ActiveMQ页面

话题

在JMS中,Topic实现了发布和订阅语义.当您发布消息时,它会发送给所有感兴趣的订阅者 - 因此,零到多订阅者将收到该消息的副本.只有在经纪人收到消息时拥有有效订阅的订阅者才能获得该消息的副本.

队列

JMS队列实现负载均衡器语义.一个消费者将收到一条消息.如果在发送消息时没有可用的消费者,则将保留消费者,直到有消费者可以处理消息为止.如果消费者收到消息并且在关闭之前没有确认消息,那么该消息将被重新传递给另一个消费者.队列可以让许多消费者在可用消费者之间对消息进行负载平衡.

我希望有一个"东西",它将以与ActiveMQ代理接收消息的顺序相同的顺序向每个订阅者发送消息的副本.

有什么想法吗?

Jos*_*ger 132

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

  • 知道负载平衡如何为JMS或WSO2 MB中的队列工作? (4认同)

小智 48

主题适用于发布者 - 订阅者模型,而队列适用于点对点.


Axe*_*ehl 25

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

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

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


Dan*_*ník 18

就这么简单:

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

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

在此处输入图片说明

  • 一个简单的社交网络就是一个例子。有人“喜欢”某个帖子。后端向主题发布“POST LIKE”事件。它被 3 个订阅者使用:``notificationProcessor```(向发布者发送通知)、``karmaProcessor````(向喜欢者和发布者提供 karma)、``feedProcessor````(将记号向上移动到人们的提要)。当然都是异步的。 (6认同)

abh*_*nyu 10

队列

优点

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

缺点

  • 只有一个消费者可以得到消息
  • 意味着生产者和消费者之间的耦合,因为它是一对一的关系

话题

优点

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

缺点

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


eeb*_*sen 8

关于订单保存,请参阅此ActiveMQ页面.简而言之:为单个消费者保留订单,但是不保证多个消费者的订单交付.