簡體   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