Rabbitmq consumer_timeout 行为未按预期工作?

我很难证明 consumer_timeout 设置按预期工作。我可能做错了事或误解了 consumer_timeout 行为。

我所有的测试代码都可以在这里找到: https://github.com/Rafarel/rabbitmq-tests

基本上,我将 consumer_timeout 设置为 10000 毫秒(10 秒),然后在尝试确认消息之前,我尝试使用比超时值(20 秒)长一点的回调来使用消息。

由于超时,我应该有一个 PRECONDITION_FAILED 异常,但事实并非如此。如果我将 SLEEP_DURATION 中的 receive_timeout.py 设置为超过 consumer_timeout 值(例如 60 秒),我会有例外。

引自 https://www.rabbitmq.com/consumers.html#acknowledgement-timeout

如果消费者在超过超时值(默认为 30 分钟)内未确认其交付,则其通道将因 PRECONDITION_FAILED 通道异常而关闭。

如果有人可以帮助我理解我做错了什么,那就太好了,谢谢!

stack overflow Rabbitmq consumer_timeout behavior not working as expected?
原文答案

答案:

作者头像

对于未来的读者:

consumer_timeout 从来都不是为了提供任何精度,它主要是为了保护仲裁队列和非常长时间运行的消费者

默认情况下,超时只会每 60 秒评估一次。此间隔由 channel_tick_interval 设置控制(已编辑)

所以尝试降低滴答间隔以获得更高的精度。

您的代码也阻塞了 IO: https://github.com/Rafarel/rabbitmq-tests/issues/1

作者头像

一些有用的提示:

1.动态配置

您可以通过在 RabbitMQ 服务器上运行以下命令来动态设置 consumer_timeout 值:

rabbitmqctl eval 'application:set_env(rabbit, consumer_timeout, 36000000).'

这会将新超时设置为 10 小时(36000000 毫秒)。要使其生效,您需要重新启动您的工作人员。现有的工作连接将继续使用旧的超时。

您还可以检查当前配置的超时值:

rabbitmqctl eval 'application:get_env(rabbit, consumer_timeout).'

  1. 使用 Docker 镜像

如果你通过 Docker 镜像运行 RabbitMQ,这里是设置值的方法:只需将 -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 36000000" 添加到 docker run 或将环境 RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS 设置为 "-rabbit consumer_timeout 36000000"