0

我目前正在嘗試設計一個可擴展的卡夫卡消費者體系結構,我遇到了一些與偏移協調問題。對我的使用情況來說很重要的一點是,卡夫卡消費的每條消息只需處理一次卡夫卡工作/抵消協調與消費者

就拿問題的說明如下:(!業務邏輯,耶)

  1. 消費者從卡夫卡檢索消息
  2. 消費者處理消息
  3. 消費者完成處理時,增量本地偏移
  4. 消費者嘗試將偏移量返回給kafka
  5. 此網絡呼叫因X原因而失敗
  6. 上述錯誤,或別的,使消費者崩潰之前偏移提交可以重試
  7. 系統協調器帶來了另一個消費者,然後取出過時偏移
  8. 同樣的消息被檢索到,並重新處理(差!)

對於那些比我具有更多分佈式系統經驗的人,您可能已經認識到,這是(或多或少)應用於Kafka偏移/工作結果協調的兩個將軍問題。

我想過在一個(可能是SQL)數據庫事務中提交偏移量和工作結果,但將這些實現綁定在一起,並限制了我的數據存儲選項(另外,如果我移動數據存儲到沒有交易的東西?)。另一個可能的解決方案是散列每條消息並使用bloom過濾器來概率地防止重複處理,但是現在我們開始增加我最好避免的複雜性。

回答

0

這種問題在系統與卡夫卡的常見問題解答suggests之間的界限上很常見,以便使用事務來實現一次性交付擔保。

您提出了一個擔憂,即事務的需要會限制SQL解決方案的存儲選擇。這是不正確的,因爲許多像Riak,Cassandra,RethinkDB或CockroachDB這樣的NoSQL解決方案都具有諸如單文檔原子或比較 - 設置操作之類的機制,這些操作可以用作ACID事務的替代或作爲客戶端的基礎ACID交易。

有關更多信息,請參閱How to manage transactions over multiple databases問題,因爲多分片交易的算法也可以在多密鑰級別上正常工作。