当消息在没有订阅者的队列上发布时会发生什么?
what happens when message published on queue with no Subscriber?
这是我在一次采访中被问到的。
当消息在上午 10 点发布到没有订阅者的队列时会发生什么?并且具有适当过滤器的订阅者在上午 10.02 订阅同一个队列。当消息到达代理后订阅者订阅时消息是否被传递(我的意思是它是否存储在内存中直到找到订阅者)?什么是默认行为? JMS、STOMP 和 AMQP 标准也不同吗?
在 AMQP 代理中,消息要么传递给订阅队列的消费者,要么当消费者 fetch/pull 消息按需从队列传递时。即使此时没有订阅者处于活动状态,消息也会默认保留在队列中。如果消息是持久消息,则消息将存储在磁盘上;如果不是持久消息,则消息将存储在内存中。 https://www.rabbitmq.com/tutorials/amqp-concepts.html
STOMP:RabbitMQ STOMP 适配器支持多种不同的目标类型。当没有订阅者存在时发送的消息将排队,直到订阅者连接到队列(而主题将在没有连接的订阅者时丢弃消息)。 https://www.rabbitmq.com/stomp.html
JMS:
JMS 是一个 API,它不使用任何协议。另一方面,AMQP 是消息传递客户端和消息传递服务器之间的协议。 JMS 客户端可以使用 AMQP 作为与消息传递服务器通信的协议。 (查看这篇文章以获取有关该主题的更多信息 https://spring.io/understanding/AMQP)
但是,发送到队列的消息会保留在队列中,直到该队列的消息使用者使用它们。
http://docs.oracle.com/javaee/6/tutorial/doc/bnceh.html 和
https://en.wikipedia.org/wiki/Java_Message_Service
正如问题中提到的发布者和订阅者,我认为问题是关于 Publish-Subscribe 消息传递模式的。在 Pub/Sub 模式中,发布是针对主题而不是队列。
行为取决于消息提供者。如果没有订阅者,消息传递提供者可能会丢弃发布。因此,如果一条消息在上午 10 点发布到主题,则该发布将被丢弃,因为没有订阅者。现在,当有新订阅者加入时 10:02AM,发布将不会传送给订阅者。
IBM MQ中有一个"Retain Publication"的概念。当发布设置了 "Retain Publication" 属性时,IBM MQ 队列管理器将为主题保留此类发布的副本,直到为同一主题制作新发布为止。假设 "Retain Publication" 的发布是在上午 10 点发布的,当订阅者在 10:02AM 到达时,订阅者将获得该发布。
希望对您有所帮助。
这是我在一次采访中被问到的。
当消息在上午 10 点发布到没有订阅者的队列时会发生什么?并且具有适当过滤器的订阅者在上午 10.02 订阅同一个队列。当消息到达代理后订阅者订阅时消息是否被传递(我的意思是它是否存储在内存中直到找到订阅者)?什么是默认行为? JMS、STOMP 和 AMQP 标准也不同吗?
在 AMQP 代理中,消息要么传递给订阅队列的消费者,要么当消费者 fetch/pull 消息按需从队列传递时。即使此时没有订阅者处于活动状态,消息也会默认保留在队列中。如果消息是持久消息,则消息将存储在磁盘上;如果不是持久消息,则消息将存储在内存中。 https://www.rabbitmq.com/tutorials/amqp-concepts.html
STOMP:RabbitMQ STOMP 适配器支持多种不同的目标类型。当没有订阅者存在时发送的消息将排队,直到订阅者连接到队列(而主题将在没有连接的订阅者时丢弃消息)。 https://www.rabbitmq.com/stomp.html
JMS: JMS 是一个 API,它不使用任何协议。另一方面,AMQP 是消息传递客户端和消息传递服务器之间的协议。 JMS 客户端可以使用 AMQP 作为与消息传递服务器通信的协议。 (查看这篇文章以获取有关该主题的更多信息 https://spring.io/understanding/AMQP)
但是,发送到队列的消息会保留在队列中,直到该队列的消息使用者使用它们。 http://docs.oracle.com/javaee/6/tutorial/doc/bnceh.html 和 https://en.wikipedia.org/wiki/Java_Message_Service
正如问题中提到的发布者和订阅者,我认为问题是关于 Publish-Subscribe 消息传递模式的。在 Pub/Sub 模式中,发布是针对主题而不是队列。
行为取决于消息提供者。如果没有订阅者,消息传递提供者可能会丢弃发布。因此,如果一条消息在上午 10 点发布到主题,则该发布将被丢弃,因为没有订阅者。现在,当有新订阅者加入时 10:02AM,发布将不会传送给订阅者。
IBM MQ中有一个"Retain Publication"的概念。当发布设置了 "Retain Publication" 属性时,IBM MQ 队列管理器将为主题保留此类发布的副本,直到为同一主题制作新发布为止。假设 "Retain Publication" 的发布是在上午 10 点发布的,当订阅者在 10:02AM 到达时,订阅者将获得该发布。
希望对您有所帮助。