【问题标题】:what happens when message published on queue with no Subscriber?当消息在没有订阅者的队列上发布时会发生什么?
【发布时间】:2017-06-25 12:34:49
【问题描述】:

这是在一次采访中问我的。

如果在上午 10 点在没有订阅者的队列上发布消息时会发生什么?并且具有适当过滤器的订阅者在上午 10.02 订阅同一队列。当订阅者在消息到达代理后订阅时,消息是否会被传递(我的意思是它是否存储在内存中,直到找到订阅者)?什么是默认行为?在 JMS、STOMP 和 AMQP 标准中也有不同吗?

【问题讨论】:

    标签: rabbitmq jms message-queue amqp stomp


    【解决方案1】:

    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.htmlhttps://en.wikipedia.org/wiki/Java_Message_Service

    【讨论】:

    • 刚刚在rabbitmq.com/stomp.html 上找到了这个 队列目的地最多将每条消息传递给一个订阅者。不存在订阅者时发送的消息将排队,直到订阅者连接到队列。
    【解决方案2】:

    正如问题中提到的发布者和订阅者一样,我认为问题在于发布-订阅消息传递模式。在 Pub/Sub 模式中,发布是针对一个主题,而不是队列。

    行为取决于消息传递提供程序。如果没有订阅者,消息传递提供者可能会丢弃发布。因此,如果在上午 10 点将消息发布到某个主题,则该发布将被丢弃,因为没有订阅者。现在,当新订阅者在上午 10:02 到来时,将不会将发布传递给订阅者。

    IBM MQ 中有一个“保留发布”的概念。当发布设置了“保留发布”属性时,IBM MQ 队列管理器将为某个主题保留此类发布的副本,直到为同一主题创建新发布为止。假设在上午 10 点发布了带有“保留发布”的发布,当订阅者在上午 10:02 到达时,订阅者将获得该发布。

    希望这会有所帮助。

    【讨论】:

    • 同意,消息可能会发布到主题或交换等。但他说:“当消息在队列上发布时” - 我假设消息已通过交换并已成功到达队列。
    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 2015-03-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多