kafka訊息與同步機制
阿新 • • 發佈:2019-01-07
- 0 ,相當於非同步傳送,訊息傳送完畢即offset增加,繼續生產;相當於At most once
- 1,leader收到leader replica 對一個訊息的接受ack才增加offset,然後繼續生產;
- -1,leader收到所有replica 對一個訊息的接受ack才增加offset,然後繼續生產
當producer向broker傳送訊息時,一旦這條訊息被commit,因數replication的存在,它就不會丟。但是如果producer傳送資料給broker後,遇到的網路問題而造成通訊中斷,那producer就無法判斷該條訊息是否已經commit。這一點有點像向一個自動生成primary key的資料庫表中插入資料。雖然Kafka無法確定網路故障期間發生了什麼,但是producer可以生成一種類似於primary
key的東西,發生故障時冪等性的retry多次,這樣就做到了Exactly one。截止到目前(Kafka 0.8.2版本,2015-01-25),這一feature還並未實現,有希望在Kafka未來的版本中實現。(所以目前預設 情況下一條訊息從producer和broker是確保了At least once,但可通過設定producer非同步傳送實現At most once)。
consumer在從broker讀取訊息後,可以選擇commit,該操作會在Zookeeper中存下該consumer在該partition下讀取的訊息的offset。該consumer下一次再讀該partition時會從下一條開始讀取。如未commit,下一次讀取的開始位置會跟上一次commit之後的開始位置相同。當然可以將consumer設定為autocommit,即consumer一旦讀到資料立即自動commit。如果只討論這一讀取訊息的過程,那Kafka是確保了