【问题标题】:when does an AMQP/RabbitMQ channel with no connections die?没有连接的 AMQP/RabbitMQ 通道何时死亡?
【发布时间】:2012-03-22 19:24:18
【问题描述】:

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

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

是否需要进行一些配置才能在进程被终止后注意到连接已终止?

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

【问题讨论】:

  • 仅供参考:我遇到了类似的问题,在独占消费者死亡后,没有及时清理代理上的独占队列。这阻止了这些具有确定名称的组件启动。通过将ConnectionFactory.RequestedHeartbeat 设置为一个较小的值(秒)解决了这个问题

标签: java message-queue rabbitmq amqp spring-amqp


【解决方案1】:

AMQP 使用队列和交换。您在交换中发布并绑定队列以从交换中获取消息(您可以在我的博客上看到 short explanation。当您创建队列时,您可以将其设置为自动删除以及它之前保持未使用的时间它会自动删除。 以下是 RabbitMQ quickref 的引述:

queue.declare(short reserved-1, queue-name queue, bitpassive, bit 耐用、位独占、位自动删除、无需等待、无需等待、表格 参数)➔ 声明确定

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

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

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

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

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

镜像队列我们开发了主动/主动高可用性 排队。这通过允许在其他节点上镜像队列来工作 在 RabbitMQ 集群中。结果是应该一个节点 集群失败,队列可以自动切换到其中一个镜像 并继续运营,没有不可用的服务。去创造 一个镜像队列,您在参数中提供一个 x-ha-policy 参数 此方法的参数。

【讨论】:

  • 我不希望队列被删除,我希望它是持久的。但我也希望重新传递未确认的消息(由在确认之前死亡的进程消耗)。需要删除的是死连接/通道,而不是消息。
  • 好的,现在我知道了 - 您需要创建 ConnectionParameters 实例并将心跳 (setRequestedHeardbeat) 设置为合理的值(1 次心跳未命中将关闭通道)然后将其传递给 ConnectionFactory 构造函数
  • @Arnon Rotem-Gal-Oz,设置 RequestedHeartbeat 解决了我的类似问题,即未及时清理代理上的独占队列。这阻止了声明具有确定性名称的独占队列的组件启动。
  • @drstevens 对——这几乎是同一个问题。代理需要知道客户端已经离开以释放资源
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多