9

我有一个简单的 RabbitMQ 测试程序随机排列消息,另一个读取它们,全部使用 Spring-AMQP。如果消费者死亡(例如在没有机会关闭其连接或通道的情况下杀死一个进程),它没有确认的任何消息似乎永远保持未确认状态。

我看到许多参考资料(例如这个问题)说通道在没有连接时会死掉,并且剩余的未确认消息将被重新传递。这不是我看到的行为 - 相反,我得到越来越多的标记为 IDLE 的频道列表和越来越多的标记为正在运行但没有活动的连接列表。

是否需要一些配置来注意一旦进程被杀死,连接就死了?

编辑: 我在 VirtualBox VM 中运行 rabbitmq 服务器,它显然不能通过 NAT 正确管理死的入站连接。这适用于直接在物理主机上运行的 mq 服务器。

4

2 回答 2

4

AMQP 使用队列和交换。您在交换中发布并绑定队列以从交换中获取消息(您可以在我的博客上看到一个简短的解释。当您创建队列时,您可以将其设置为自动删除以及在它之前将保持多长时间未使用自动删除。这是来自 RabbitMQ quickref 的引用:

queue.declare(short reserved-1,queue-name queue,位被动,位持久,位排他,位自动删除,无等待无等待,表参数)➔ 声明确定

支持:完整的声明队列,根据需要创建。

此方法创建或检查队列。在创建新队列时,客户端可以指定控制队列及其内容的持久性以及队列共享级别的各种属性。

RabbitMQ 实现了对 AMQP 规范的扩展,允许队列的创建者控制其行为的各个方面。

每队列消息 TTL 此扩展确定发布到队列的消息在被服务器丢弃之前可以存活多长时间。使用此方法的 arguments 参数的 x-message-ttl 参数配置生存时间。

队列到期队列可以用可选的租用时间声明。租用时间决定了一个队列在被服务器自动删除之前可以保持多长时间未被使用。租用时间在此方法的 arguments 参数中作为 x-expires 参数提供。

镜像队列我们为队列开发了主动/主动高可用性。这是通过允许在 RabbitMQ 集群中的其他节点上镜像队列来实现的。结果是如果集群的一个节点发生故障,队列可以自动切换到其中一个镜像并继续运行,而不会出现服务不可用的情况。要创建镜像队列,请在该方法的 arguments 参数中提供一个 x-ha-policy 参数。

于 2011-11-28T17:05:05.720 回答
3

回答关闭。事实证明这不是一个真正的问题。

我在 VirtualBox VM 中运行 rabbitmq 服务器,它显然不能通过 NAT 正确管理死的入站连接。这适用于直接在物理主机上运行的 mq 服务器。

于 2012-03-22T11:24:18.633 回答