1. 程式人生 > >kafka訊息與同步機制

kafka訊息與同步機制

  • 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
consumer在從broker讀取訊息後,可以選擇commit,該操作會在Zookeeper中存下該consumer在該partition下讀取的訊息的offset。該consumer下一次再讀該partition時會從下一條開始讀取。如未commit,下一次讀取的開始位置會跟上一次commit之後的開始位置相同。當然可以將consumer設定為autocommit,即consumer一旦讀到資料立即自動commit。如果只討論這一讀取訊息的過程,那Kafka是確保了
Exactly once。但實際上實際使用中consumer並非讀取完資料就結束了,而是要進行進一步處理,而資料處理與commit的順序在很大程度上決定了訊息從broker和consumer的delivery guarantee semantic。