Rabbitmq的consumer_timeout行为不符合预期?

9

我很难证明consumer_timeout设置按预期工作。

我可能做错了什么或者误解了consumer_timeout的行为。

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

基本上,我将consumer_timeout设置为10000ms(10秒),然后尝试使用回调函数消费消息,在回调函数中等待超时时间值(20秒)之后再尝试确认消息。

我应该因为超时而收到PRECONDITION_FAILED异常,但事实并非如此。 只有当我将receive_timeout.py中的SLEEP_DURATION设置得比consumer_timeout的值大得多,例如60秒时,我才会收到异常。

https://www.rabbitmq.com/consumers.html#acknowledgement-timeout中的引文:

如果消费者未对其传递进行确认而超过超时值(默认为30分钟),则其通道将通过PRECONDITION_FAILED通道异常关闭。

如果有人能帮助我理解我做错了什么,那将是太好了,谢谢!


1
https://github.com/Rafarel/rabbitmq-tests/issues/1 - Luke Bakken
1
看起来检查消费者超时的RabbitMQ进程每分钟只运行一次。如果您将SLEEP_DURATION增加到65秒,则应关闭通道。这种配置对我来说很有意义。它旨在保护免受“长时间运行”的进程的影响。 - Chad Knutson
2个回答

20

一些有用的提示:

  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"


我该如何确认这是否有效?我没有看到任何关于此的文档。 - JSON_Derulo
你指的是哪个解决方案:(1)还是(2)?无论如何,我已经在生产中使用了这两种解决方案,并且都运行良好。这两种解决方案都源自官方文档。例如,consumer_timeout 是变量的名称,根据文档,set_envget_env 是设置和获取变量值的官方方法。如果您有任何进一步的问题,请告诉我。 - Sarang
非常感谢您的回复,我指的是第二种解决方案。我已经开始实施它,目前看来似乎正在工作。但我还没有测试超过15分钟的任务。 - JSON_Derulo
1
太好了!要检查超时是否正确设置,只需在运行的容器中运行rabbitmqctl eval 'application:get_env(rabbit, consumer_timeout).'即可。 - Sarang
你还可以运行rabbitmqctl environment命令来查看完整的配置,包括consumer_timeout。 - JanDotNet
显示剩余2条评论

10

针对未来的读者:

consumer_timeout从来没有旨在提供任何形式的精度,它存在主要是为了保护仲裁队列和非常长时间运行的消费者。

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

因此尝试降低tick间隔以获得更加精确的结果。

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

另外


谢谢Gabriele的回答。我找不到关于这个channel_tick_interval的任何文档,所以我不知道如何更改此设置的值。我在生产中不需要非常低的tick,这只是为了测试目的。谢谢! - Raphaël Roux
2
非常感谢。你帮我省了另一个小时的侦探工作 :-D 对于未来的读者,consumer_timeoutchannel_tick_interval都可以在高级配置中设置:https://www.rabbitmq.com/configure.html#advanced-config-file,例如。[ {rabbit, [ {consumer_timeout, 2000}, {channel_tick_interval, 1000} ]} ]. - jenda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接