[英]Rabbit MQ + Spring Boot: delay between resend broken messages
[英]Spring boot 2.0 service : messages delivered from Rabbit mq but not reaching java code
我們正在使用構建在 spring boot 2.0 之上並使用 spring 集成框架的高性能兔子 mq 消費者。 預取計數設置為 150 並且並發消費者數為 4 。 一切都很好,直到有一天,某些消息在 rmq 中仍未得到確認。 當我們重新啟動我們的 Java 服務時,未確認的消息會得到處理,但問題會在一段時間后再次出現。 任何人都可以幫助解決這個奇怪的問題。 現在我們已經設置了一個 cron 作業來在 1 小時后重新啟動服務,以便沒有消息保持未確認狀態。
PS spring boot 版本 2.0 兔子 mq 版本:3.7.7
編輯
該問題已在另一項服務中返回。 我們已將 spring boot 服務升級到2.1版本和最新的 spring-amqp 版本。 消息在未確認狀態下不斷增加,服務中沒有日志。 我正在附加我們服務的線程轉儲
PS 在分析一些消息時我認為問題出在 spring 集成渠道中。 我在我們的服務中啟用了調試日志,並發現了一個引起我注意的特定日志:
2019-12-17 ; 07:33:35.111 ; WARN ; 1 --- [ Thread-3] ; o.s.a.r.l.SimpleMessageListenerContainer ; ; Closing channel for unresponsive consumer: Consumer@7bc9e6ab: tags=[[]], channel=Cached Rabbit Channel: null, conn: Proxy@40620d8e Shared Rabbit Connection: SimpleConnection@4c060c8f [delegate=amqp://kaarmaapp@10.0.12.209:5672/, localPort= 45896], acknowledgeMode=AUTO local queue size=0
有人可以對此有所了解嗎
通常有兩個可能的原因 - 偵聽器線程“卡住”在用戶代碼中(這是大多數情況下的問題)或 rabbitmq 客戶端庫具有autoRecoveryEnabled=true
; 通常,Spring AMQP 將其設置為 false,但在某些情況下可以將其設置為 true,並且在某些極端情況下,消費者會“懸空”。 Spring AMQP 不需要它,因為它有自己的連接恢復機制。
對於第一種情況,進行線程轉儲以查看線程在做什么。
對於第二種情況,升級到最新的 spring amqp(2.0.8 - boot 2.0.6)或 2.1.0(將是 boot 2.1 中的版本)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.