kafka組件簡介
六個核心角色
product 生產者(數據提供者)
topic 消息類別(每條由product發布到kafka的消息都有一個topic,不同的topic消息分開儲存)
partition 分區 物理概念(每個topic都至少有一個或很多個partition)
broker 服務器(kafka集群的一個節點)
consumer group 消費者組別
consumer 消費者
角色理解
topic&partition
可以吧topic理解陳一個先進先出的傳送帶(queue隊列),你需要在發布消息到卡夫卡的時候確定你需要吧你的消息發布的哪個隊列中
partition是為了提高卡夫卡的吞吐率,每個topic都會有若幹個portion,每個partition 代表著一個物理環境下的文件夾,文件夾裏麵儲存著改partition的所有消息和對應的索引
product
消息生產者吧消息push到卡夫卡的時候,會根據製定好的partition規則吧消息存儲到對應的partition 中,這樣就實現了負載均衡,同時也提高了IO性能
consumer group
消費者小組要和消息的消費方式結合理解:
同一個topic的同一條消息隻能被同一個consumer group 的一個consumer消費
多個consumer group 能夠同是消費同一條消息
這樣就可以實現一個廣播模式或者獨播模式
獨播: 把所有的consumer放入到同一個consumer group裏麵,那me該條消息隻能被一個consumer消費
廣播: 把每一個consumer都建立一個獨立的consumer group,那麼所有的consumer都可以消費到這條消息
交易保證(消息傳輸和接收方案)
方案
At most once 消息可能會丟,但絕不會重複傳輸
At least one 消息絕不會丟,但可能會重複傳輸
Exactly once 每條消息肯定會被傳輸一次且僅傳輸一次,很多時候這是用戶所想要的。
上遊(product->broker)
當Producer向broker發送消息時,一旦這條消息被commit,因數replication的存在,它就不會丟。但是如果Producer發送數據給broker後,遇到網絡問題而造成通信中斷,那Producer就無法判斷該條消息是否已經commit。雖然Kafka無法確定網絡故障期間發生了什麼,但是Producer可以生成一種類似於主鍵的東西,發生故障時冪等性的重試多次,這樣就做到了Exactly once。截止到目前(Kafka 0.8.2版本,2015-03-04),這一Feature還並未實現,有希望在Kafka未來的版本中實現。(所以目前默認情況下一條消息從Producer到broker是確保了At least once,可通過設置Producer異步發送實現At most once)。
下遊(broker->consumer)
consumer讀取到broker的消息的時候可以有兩種選擇
直接commit,通知卡夫卡處理完成,然後繼續業務邏輯,這樣的好處是不會多次傳輸,但是數據會丟失,因為有可能在邏輯處理的時候出現crash,那麼這條消息就會miss
處理完業務邏輯後再commit,這樣數據不會丟失,但是有可能會出現多次重複,因為,如果在業務處理完成,commit之前出現crash,那麼下一次去讀取的時候還是會去讀取該條消息,再次消費,就會出現重複消費的情況
如果一定要做到Exactly once,就需要協調offset和實際操作的輸出。精典的做法是引入兩階段提交。如果能讓offset和操作輸入存在同一個地方,會更簡潔和通用。這種方式可能更好,因為許多輸出係統可能不支持兩階段提交。比如,Consumer拿到數據後可能把數據放到HDFS,如果把最新的offset和數據本身一起寫到HDFS,那就可以保證數據的輸出和offset的更新要麼都完成,要麼都不完成,間接實現Exactly once。(目前就high level API而言,offset是存於Zookeeper中的,無法存於HDFS(分布式文件係統),而low level API的offset是由自己去維護的,可以將之存於HDFS中)
消息地址問題
發布消息和消費消息都需要知道消息需要放到哪裏,需要知道消息在哪
發布消息的時候,需要把消息放入到partition中,這個partition有一個地址參數offset(set->不可重複)
卡夫卡的消息無論是否已經消費,是不會進行刪除的
consumer消費消息是根據offset去消費的,理論是每次消費過後都會遞增該consumer持有的offset,也就是可以消費下一條消息
故此我們可以把consumer持有的offset值改小來再次消費某些消息,如果你需要的話
更多關於卡夫卡是如何存儲消息的,查看該博文
最後更新:2017-11-13 17:04:24