【问题标题】:Rabbitmq consumer_timeout behavior not working as expected?Rabbitmq consumer_timeout 行为未按预期工作?
【发布时间】:2022-10-03 03:48:34
【问题描述】:

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

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

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

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

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

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

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

  • 看起来检查 consumer_timeout 的 RabbitMQ 进程每分钟只运行一次。如果您将 SLEEP_DURATION 增加到 65 秒,您的频道应该关闭。这种配置对我来说很有意义。它旨在防止“长时间运行”进程。

标签: python rabbitmq timeout pika


【解决方案1】:

对于未来的读者:

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

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

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

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

【讨论】:

  • 感谢加布里埃尔的回答。我找不到有关此 channel_tick_interval 的任何文档,所以我不知道如何更改此设置值?我在生产中不需要非常低的滴答声,它只是为了测试目的。谢谢!
  • 非常感谢。您为我节省了另一个小时的侦探工作:-D 对于未来的读者,consumer_timeoutchannel_tick_interval 都可以在高级配置中设置:rabbitmq.com/configure.html#advanced-config-file,例如[ {兔子, [ {consumer_timeout, 2000}, {channel_tick_interval, 1000} ]} ]。
【解决方案2】:

一个有用的提示:您可以通过在 RabbitMQ 服务器上运行以下命令来动态设置 consumer_timeout 值:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多