【发布时间】:2017-06-25 12:34:49
【问题描述】:
这是在一次采访中问我的。
如果在上午 10 点在没有订阅者的队列上发布消息时会发生什么?并且具有适当过滤器的订阅者在上午 10.02 订阅同一队列。当订阅者在消息到达代理后订阅时,消息是否会被传递(我的意思是它是否存储在内存中,直到找到订阅者)?什么是默认行为?在 JMS、STOMP 和 AMQP 标准中也有不同吗?
【问题讨论】:
标签: rabbitmq jms message-queue amqp stomp
这是在一次采访中问我的。
如果在上午 10 点在没有订阅者的队列上发布消息时会发生什么?并且具有适当过滤器的订阅者在上午 10.02 订阅同一队列。当订阅者在消息到达代理后订阅时,消息是否会被传递(我的意思是它是否存储在内存中,直到找到订阅者)?什么是默认行为?在 JMS、STOMP 和 AMQP 标准中也有不同吗?
【问题讨论】:
标签: rabbitmq jms message-queue amqp stomp
在 AMQP 代理中,消息要么传递给订阅队列的消费者,要么在消费者按需从队列中获取/拉取消息时传递。即使此时没有订阅者处于活动状态,消息也会默认保留在队列中。如果消息是持久消息,则消息将存储在磁盘上,如果不是持久消息,则将存储在内存中。 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
【讨论】:
正如问题中提到的发布者和订阅者一样,我认为问题在于发布-订阅消息传递模式。在 Pub/Sub 模式中,发布是针对一个主题,而不是队列。
行为取决于消息传递提供程序。如果没有订阅者,消息传递提供者可能会丢弃发布。因此,如果在上午 10 点将消息发布到某个主题,则该发布将被丢弃,因为没有订阅者。现在,当新订阅者在上午 10:02 到来时,将不会将发布传递给订阅者。
IBM MQ 中有一个“保留发布”的概念。当发布设置了“保留发布”属性时,IBM MQ 队列管理器将为某个主题保留此类发布的副本,直到为同一主题创建新发布为止。假设在上午 10 点发布了带有“保留发布”的发布,当订阅者在上午 10:02 到达时,订阅者将获得该发布。
希望这会有所帮助。
【讨论】: