2016-12-06 91 views
0

消費者重新平衡期間如何確保消息訂購。假設最初我們有四個分區:p1,p2,p3,p4和兩個消費者c1和c2(在同一組中)。因此,每個消費者獲得兩個分區,例如c1:p1,p2和c2:p3,p4。消費者重新平衡期間的卡夫卡消息訂購

現在新增了消費者說c3和c4,重新平衡發生,以便每個消費者得到一個分區像c1:p1,c2:p2,c3:p3,c4:p4。

在此期間,有機會,消費者C1可能從分區P2處理消息(前再平衡)

和消費C2也開始處理P2消息(再平衡)之後

即使這是角落情況,這是消息排序的預期行爲?

+0

你可以多一點清楚有關問題是有關的消息是什麼排序? – yaswanth

+1

在重新平衡期間消息處理可能會失控 – ravthiru

回答

2

在此期間,有機會,消費者C1可能從分區P2處理消息(前再平衡)

和消費C2也開始處理P2消息(再平衡)之後

是。但是這與消息排序有什麼關係?只要沒有錯誤,c1應該完成處理當前記錄(假設用偏移X),並且在重新平衡c2將繼續處理具有偏移X + 1的記錄。

即使發生錯誤,並且c1未能提交偏移X-c2將重新處理一些已處理的消息,但仍然會爲分區p2保留順序。

如果在具有偏移量X2的記錄之前處理具有偏移量X1的記錄,則將按順序處理分區將只有而不是 X1。但事實並非如此(當然,您需要排除故障後處理的重新處理)。

長話短說:是的,這是behavoir設計

如果你建立一個無狀態的應用程序,每一個記錄進行獨立這項工作很順利。如果需要狀態,則需要確保在重新平衡之後(在c2開始處理數據之前)它從消費者c1轉移到c2的分區p2的狀態。移動狀態實際上是一個棘手的問題,你應該考慮使用卡夫卡流 - 卡夫卡的流處理,可以自動處理這個對你的資料庫:http://docs.confluent.io/current/streams/index.html

+0

謝謝,在給定密鑰的使用情況下,按順序處理消息非常重要,可能很少有像重新平衡之後的競態條件1)在C1可以完成對分區p2中的X1的處理之前,C2可能已經處理了X + 1。 2)C1可能無法處理X1和C2完成處理X + 1。謝謝我們將考慮卡夫卡流 – ravthiru

+0

您描述的兩種情況都是不可能的 - 在C2開始接管分區之前,C1完成處理,或者C1沒有完成處理,C2將重試未完全處理的記錄。 如果消費者C1沒有死亡,仍然處理帶有偏移量X的記錄,並且分區被吊銷並移交給C2,當C1嘗試提交偏移量X時,代理不會允許這樣做,因爲C1不再擁有分區,因此提交將失敗,並有例外。 –

+0

C2將用偏移量X與C1並行處理記錄。因此,即使C1在C2完成處理記錄X + 1之後完成處理記錄X,也不重要,因爲C2在處理記錄X + 1之前處理了記錄X.因此,你最終只能得到C2(X),C2(X + 1)C1(X)。不知道C1中的X的第二次處理是否對您的應用程序有害。 –

0

跨分區實際上沒有消息排序,所以這是一個預期的行爲,其中C1在C2接管它之前消耗P1,並在重新平衡之後開始讀取。

+0

所有消費者都在同一組中,它是重新平衡期間在同一分區中的消息順序 – ravthiru