JMS主题vs队列

我想知道JMS Queue和JMS Topic之间的区别。

从ActiveMQ页面 ,它说

主题

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

队列

JMS队列实现负载平衡器语义。 一条消息将被一个消费者接收。 如果在发送消息时没有消费者可用,则将一直保留到消费者可用于处理消息。 如果消费者收到消息,并且在closures之前没有确认消息,消息将被重新发送给另一个消费者。 队列可以让许多消费者在可用消费者之间对消息进行负载平衡

我正在寻找一个“东西”,它将以与ActiveMQ代理收到消息的顺序相同的顺序将消息副本发送给每个用户。

有什么想法吗?

这意味着一个主题是适当的。 一个队列意味着一个消息去往唯一的一个可能的用户。 每个用户都有一个话题。

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

队列VS主题

Queue: - Point-to-point model. - Only one consumer gets the message. - Messages have to be delivered in the order sent. - A JMS queue only guarantees that each message is processed only once. - The Queue knows who the consumer or the JMS client is. The destination is known. - The JMS client (the consumer) does not have to be active or connected to the queue all the time to receive or read the message. - Every message successfully processed is acknowledged by the consumer. Topic: - Publish/subscribe model. - Multiple clients subscribe to the message. - There is no guarantee messages have to be delivered in the order sent. - There is no guarantees that each message is processed only once.As this can be sensed from the model. - The Topic, have multiple subscribers and there is a chance that the topic does not know all the subscribers. The destination is unknown. - The subscriber / JMS client needs to the active when the messages are produced by the producer, unless the subscription was a durable subscription. - No, Every message successfully processed is not acknowledged by the consumer/subscriber. 

队列 :描述性示例:JMS队列是用户使用p2p模型“拉”他们想要接收的消息的通道,而不是自动接收特定主题的消息。 生产者将消息提交给队列,接收者可以浏览队列并决定他们希望接收哪些消息。 在p2p模式中,用户可以在决定是否接受交付之前查看队列中消息的内容。

主题 :描述性示例:JMS主题是用户订阅的通道,用于从JMS消息发布和订阅模型中的生产者接收特定消息。 这个模式可以比作订阅报纸; 例如,如果约翰·杜(John Doe)订阅了“纽约时报”(The New York Times),他将每天从报纸制作人收到报纸。 同样,如果John Doe使用JMS消息传递来订阅特定主题,他将收到所有来自生产者的关于该主题的消息。

至于订单保存,请参阅此ActiveMQ页面 。 总之:订单是为单个消费者保留的,但是对于多个消费者的订单是不能保证的。

JMS主题是一对多分布模型中的目的地types。 所有消费用户都收到相同的发布消息。 你也可以称之为“广播”模式。 在分布式计算的观察者devise模式中 ,您可以将主题想象为主题的等同物。 一些JMS提供者有效地select将其实现为UDP而不是TCP。 对于主题的消息传递是“即忘即忘”的 – 如果没有人收听,消息就会消失。 如果这不是你想要的,你可以使用“持久订阅”。

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

在大多数环境中,我认为, 主题是更好的select,因为您可以随时添加其他组件,而无需更改体系结构。 增加的组件可能是监控,日志logging,分析等等。在项目开始阶段,你永远不知道1年,5年,10年的需求会是什么样子。 变化是不可避免的,拥抱它:-)

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

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

你说你正在寻找一个“东西”,它将把消息的一个副本按照ActiveMQ代理接收消息的顺序发送给每个用户。

所以你想要使用一个主题,以便所有N个订阅者获得一个消息副本。

队列是JMSpipe理对象,用于存放等待用户消费的消息。 当所有用户消费该消息时,消息将从队列中移除。

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