消费者拿了消息却不确认(处理卡死、死循环),消息会被一直占着。consumer_timeout 是 RabbitMQ 的兜底。它默认多久、怎么按队列覆盖、真的会在超时后关掉 channel 吗?这篇如实记录能验证的和没验证到的。
不改配置的节点: $ rabbitmqctl eval "application:get_env(rabbit, consumer_timeout)." → {ok,1800000}
改了配置的节点: 同样的命令 → {ok,10000}默认 consumer_timeout 是 1800000 ms(30 分钟),可在 rabbitmq.conf 里设置;rabbitmqctl eval 能读到当前值。
经典队列带 x-consumer-timeout=2000: ChannelClosedByBroker: (406, "PRECONDITION_FAILED - invalid arg 'x-consumer-timeout' for queue 'ctc' in vhost '/' of queue type rabbit_classic_queue")
quorum 队列带 x-consumer-timeout=2000: 成功
$ rabbitmqctl set_policy ct-pol "^ctp$" '{"consumer-timeout":3000}' --apply-to queues → ol" for pattern "^ctp$" to "{"consumer-timeout":3000}" with priority "0" for vhost "/" ...
list_policies: / | ct-pol | ^ctp$ | queues | {"consumer-timeout":3000} | 0quorum 队列接受队列参数 x-consumer-timeout,经典队列返回 406 invalid arg;policy consumer-timeout 都可以设置。
ct.classic: 420 s 内 channel 没有被关;此时队列 (ready, unacked) = (0, 1) ct.quorum: 420 s 内 channel 没有被关;此时队列 (ready, unacked) = (1, 0) broker 日志里和消费者超时有关的行: ["<0.1032.0> operation queue.declare caused a channel exception precondition_failed: invalid arg 'x-consumer-timeout' for queue 'ctc' in vhost '/' of qu"] 结论(仅限这次实验):consumer_timeout=10 s 的配置读到了,可是 7 分钟内没有观察到 broker 因为未确认而关闭 channel;我没有找到原因——文档说这个检查是周期性的(以分钟计),可是 7 分钟已经跨过了好几个周期
把超时配成 10 秒,消费者收到消息后不确认,等了 7 分钟,channel 没有被关,日志里也没有相关记录。可能是这个检查的触发条件我没有满足,也可能是 4.3.6 的行为与我预期不同——这里没有查清,所以不写“超时之后一定会怎样”。