Rabbitmq Consumer_Timeout 行为未按预期工作?

Rap*_*oux 9 python timeout rabbitmq pika

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

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

基本上,我将时间consumer_timeout设置为 10000 毫秒(10 秒),然后尝试通过回调来消耗该消息,该回调的睡眠时间比超时值(20 秒)长一点,然后再尝试确认该消息。

由于超时,我应该有一个 PRECONDITION_FAILED 异常,但事实并非如此。如果我设置的SLEEP_DURATION方式receive_timeout.pyconsumer_timeout60 秒之类的值,

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

如果消费者在超过超时值(默认为 30 分钟)的时间内没有确认其交付,则其通道将被关闭,并出现 PRECONDITION_FAILED 通道异常。

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

Sar*_*ang 21

一些有用的提示:

  1. 动态配置

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

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".


Gab*_*ele 10

对于未来的读者:

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

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

因此,请尝试降低刻度间隔以获得更高的精度。

另外,您的代码会阻止 IO: https ://github.com/Rafarel/rabbitmq-tests/issues/1

  • 非常感谢。你又节省了我一个小时的侦探工作:-D 对于未来的读者,`consumer_timeout`和`channel_tick_interval`都可以在高级配置中设置:https://www.rabbitmq.com/configure.html#advanced-config-file,例如 [ {rabbit, [ {consumer_timeout, 2000}, {channel_tick_interval, 1000} ]} ]。 (2认同)