繁体   English   中英

Rabbitmq consumer_timeout 行为未按预期工作?

[英]Rabbitmq consumer_timeout behavior not working as expected?

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

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

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

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

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

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

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

一些有用的提示:

  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 张图片

If you are running RabbitMQ via Docker image, here's how to set the value: Simply add -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 36000000" to your docker run OR set the environment RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS to "-rabbit consumer_timeout 36000000" .

对于未来的读者:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM