我目前正在嘗試設計一個可擴展的卡夫卡消費者體系結構,我遇到了一些與偏移協調問題。對我的使用情況來說很重要的一點是,卡夫卡消費的每條消息只需處理一次。卡夫卡工作/抵消協調與消費者
就拿問題的說明如下:(!業務邏輯,耶)
- 消費者從卡夫卡檢索消息
- 消費者處理消息
- 消費者完成處理時,增量本地偏移
- 消費者嘗試將偏移量返回給kafka
- 此網絡呼叫因X原因而失敗
- 上述錯誤,或別的,使消費者崩潰之前偏移提交可以重試
- 系統協調器帶來了另一個消費者,然後取出過時偏移
- 同樣的消息被檢索到,並重新處理(差!)
對於那些比我具有更多分佈式系統經驗的人,您可能已經認識到,這是(或多或少)應用於Kafka偏移/工作結果協調的兩個將軍問題。
我想過在一個(可能是SQL)數據庫事務中提交偏移量和工作結果,但將這些實現綁定在一起,並限制了我的數據存儲選項(另外,如果我移動數據存儲到沒有交易的東西?)。另一個可能的解決方案是散列每條消息並使用bloom過濾器來概率地防止重複處理,但是現在我們開始增加我最好避免的複雜性。