【问题标题】:Messages on a RabbitMQ Topic Exchange queueRabbitMQ 主题交换队列上的消息
【发布时间】:2011-12-29 16:23:52
【问题描述】:

注意:使用 RabbitMQ .NET 库

我的 RabbitMQ 上有一个名为 FXTO.HK 的主题交换和 FXTO.# 的绑定键 服务器将消息发布到此队列。

在客户端,队列具有唯一且随机的名称,但使用相同的绑定键 FXTO.#

我们在客户端使用库中的 Subscription 类,它工作正常:即。消息被所有客户端同时接收。

但是,在 RabbitMQ 管理 UI 中,服务器队列 (FXTO.HK) 显示队列中有所有消息(它们没有从队列中删除)。

我的设置有什么问题吗?这些消息何时会从服务器队列中移除?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    这个问题更适合RabbitMQ Discuss邮件列表。

    但是,在 RabbitMQ 管理 UI 中,服务器队列 (FXTO.HK) 显示所有消息都在队列中(它们没有从队列中删除)。

    这强烈表明您在使用消息后没有确认消息。查看this 示例,我发现您需要在每次调用Subscription.Next 后调用Subscription.Ack(或在NoAck mode 中启动Subscription

    【讨论】:

    • 我确实确认消息。 UI 将消息编号显示为 Ready = x、Unacked = 0 和 Total = x。所以看来确认是有效的
    【解决方案2】:

    我不太确定您的问题中的“客户端”和“服务器”是什么意思。 RabbitMQ 不理解客户端和服务器,只是将自己视为每个人的服务器。发布者和消费者本质上都不是客户端或服务器。

    您说“我的 RabbitMQ 上有一个名为 FXTO.HK 的主题交换和一个 FXTO 的绑定键。# 服务器将消息发布到此队列。”,但这没有意义。消息是否正在发布到FXTO.HK exchange 或其他一些queue?我认为混淆可能是您问题的根源:

    • 如果您的带有FXTO.?? 路由键的消息被发布到exchange(即您在publish 函数的参数中设置了“exchange”),其中一个或多个使用FXTO.# 的绑定键绑定到它的队列,这些消息将被复制到每个绑定队列中。这些消息将保留在每个队列中,直到它们在 no-ack 模式下被使用或被确认。如果你碰巧有一个与exchange 绑定到exchange 的同名队列(例如exchange FXTO.HK 被绑定到队列FXTO.HK 并带有一些绑定键),不会因为它们共享相同而发生特殊行为姓名。消息将被复制到每个匹配的绑定队列中,包括 FXTO.HK,并会一直保留在该队列中,直到消费者连接到它并确认它们。
    • 如果您的消息被发布到一个名为FXTO.HK队列(即您没有在publish 的参数中设置“交换”,或者您使用的是默认交换) ,您的消息将保留在该队列中,直到消费者连接到该队列并接收/确认它们。不会发生交换/扇出路由。

    【讨论】: