2017-06-14 65 views
1

我已閱讀其他線程,並通過使用新的組ID識別問題,但是我想了解可能導致此問題的原因。消費者卡在重新加入

我有一個主題與16個分區,我已經設置session.timeout.ms = 30000和max.poll.interval.ms = 30000000。

我運行我的程序,並按ctrl + c它,所以它沒有正確關閉。我猜,16次之後,我陷入了這個重新加入的問題。 session.timeout.ms是心跳超時,所以30秒後它應該踢我的消費者權利,我的分區應該「釋放」權利?還是隻聽我的max.poll.interval.ms?

編輯:我仍然間歇地得到這個錯誤,當它發生時,我必須重新啓動我的所有消費者。即使我的消費者運行良好,然後他們開始都陷入重新加入的狀態(沒有消費者被添加/刪除),這種情況也會發生。下面是當我嘗試當它停留在該國一個新的消費後連接到它的錯誤日誌:

https://pastebin.com/AXJeSHkp

2017-06-29 17:28:16,215 DEBUG [AbstractCoordinator] - [scheduler-1] - Sending JoinGroup ((type: JoinGroupRequest, groupId=ingestion-matching-kafka-consumer-group-dev1, sessionTimeout=30000, rebalanceTimeout=43200000, memberId=, protocolType=consumer, groupProtocols=org[email protected]b45e5583)) to coordinator kafka04-prod01.messagehub.services.us-south.bluemix.net:9093 (id: 2147483644 rack: null) 

2017-06-29 17:37:21,261 DEBUG [NetworkClient] - [scheduler-1] - Node 2147483644 disconnected. 
2017-06-29 17:37:21,263 DEBUG [ConsumerNetworkClient] - [scheduler-1] - Cancelled JOIN_GROUP request {api_key=11,api_version=1,correlation_id=19,client_id=ingestion-matching-kafka-consumer-dev1} with correlation id 19 due to node 2147483644 being disconnected 

這些都是我認爲相關的第一個和最後的消息。以下是我設定的相關超時時間:

session.timeout.ms=30000 
max.poll.interval.ms=43200000  
request.timeout.ms=43205000 # the docs said to keep this higher than max.poll.interval.ms 
enable.auto.commit=false 

我應該設置heartbeat.interval.ms嗎?這是心跳在一些後臺線程中自動發送給經紀人的時間間隔(我閱讀過文檔,但出於某種原因,我無法將我的頭圍繞在它周圍)?

回答

1

如果您的客戶端沒有正確斷開連接(崩潰或SIGINT),它將需要session.timeout.ms(在您的情況下爲30秒)以便服務器將其從組中踢出。在此期間,服務器仍然會認爲消費者是該組的一部分,因此不會進行任何重新分配。一旦這個延遲結束,分配的分區將被重新分配給其他消費者(如果有的話)。

這當然不會發生,如果您使用新的組ID。儘管每次開發時都會使用新的組(這是因爲您不必等待),但您會失去前一組的任何已提交的偏移量,這可能不代表您的應用在生產中運行時的狀態。

關於max.poll.interval.ms,它是消費者邏輯中2次調用poll()之間允許的最大延遲時間。我不認爲這個設置與這個問題有關。

+0

恩,謝謝澄清。如果我等待的時間超過30秒(幾乎至少10分鐘才能重新加入),你知道還有什麼其他超時嗎? – kyl

+0

在這種情況下,我建議你打開log4j中的調試或跟蹤,並檢查客戶端在做什麼 –

+0

嗨,我已經更新了我的原始問題與日誌和更多信息,如果你有任何意見/見解,將非常讚賞 – kyl