目錄
什麼是kafka
Kafka是一個分佈式消息傳遞系統,通過發佈-訂閱模型提供快速、高可伸縮性和冗餘的消息傳遞。
爲什麼要使用消息中間件kafka
解耦,異步,削峯,這是消息隊列的三大優勢。
Kafka與其它中間件的區別
中小型軟件公司,建議選RabbitMQ,萬級別,us,主從架構。
大型軟件公司,根據具體使用在rocketMq和kafka之間二選一。十萬級別,ms,分佈式架構。
Kafka的簡單演變
kafka一代
簡單的先入先出隊列,生產者放入消息,消費者拿出消息處理。消費者端會記錄一個offset,表明該消費者當前消費到哪條數據,所以下次消費者想繼續消費,只需從offset+1的位置繼續消費就好了。消費者甚至可以通過調整offset的值,重新消費以前的數據。
出現的問題:
所有消息都放到一個隊列當中,一方面消息的類型魚龍混雜,另一方面,消息增多,速度一定會很慢。
Kafka二代
採用多條隊列, 每條隊列裏面的消息都是相同的topic。一個隊列只有一種topic,消費者再也不用擔心會碰到不是自己想要的topic的消息了。提高吞吐量。不同topic的消息交給不同隊列去存儲,再也不用以一敵十了。消息可以根據topic和key選擇合適的Partition隊列。
什麼是topic?
所有Kafka消息都被組織成主題topic。如果你想發送一條消息,你就把它發送到一個特定的topic,如果你想讀一條消息,你就從一個特定的topic讀它。
出現的問題:
高可用性,單點是不可靠的。
Kafka三代
解決單點不可靠的問題,引入了集羣。Kafka對集羣的支持也是非常友好的。在Kafka中,集羣裏的每個實例叫做Broker。每個partition不再只有一個,而是有一個leader(紅色)和多個replica(藍色),生產者根據消息的topic和key值,確定了消息要發往哪個partition之後(假設是p1),會找到partition對應的leader(也就是broker2裏的p1),然後將消息發給leader,leader負責消息的寫入,並與其餘的replica進行同步。一旦某一個partition的leader掛掉了,那麼只需提拔一個replica出來,讓它成爲leader就ok了,系統依舊可以正常運行。
Zookeeper在kafka中的作用
- 使用Zookeeper來進行所有Broker的管理。
- 生產者通過監聽zookeeper上Broker節點感知Broker,Topic的狀態,變更,來實現動態負載均衡機制,當然這個機制Kafka已經結合zookeeper實現了。
- 記錄消息消費進度Offset記錄。
- 記錄消息分區於消費者的關係。
另外,新版本在主鍵弱化zookeeper的作用,減少了對zookeeper的依賴。
如何選擇partitions的數目
越多的partitions會有更高的吞吐量,但是它會增加時延,不可靠性,以及更多的存儲空間。所以,需要一些權衡。
什麼是kafka的消費者組
消費者組保證了以下內容:
- 一個分區只可以被消費組中的一個消費者所消費。
- 一個消費組中的一個消費者可以消費多個分區。
- 一個消費組中的不同消費者消費的分區一定不會重複。
- 一個消費組所有消費者一起消費所有的分區
作用:
- 高性能,同一個消費者組的消費者分擔了壓力,比一個消費者強。
- 消費模式靈活,可以有不同的組合方式。
- 故障容災,如果一個消費者組中的一個消費者故障了,其它消費者仍然可以消費所有的分區。
剩餘的內容
下載並安裝kafka,搭建環境。
Kafka的簡單生產者消費者代碼實現。
參考文章
- https://zhuanlan.zhihu.com/p/37405836
- https://sookocheff.com/post/kafka/kafka-in-a-nutshell/
- https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying
- https://blog.csdn.net/u011311291/article/details/85264046?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
- https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/
- https://blog.csdn.net/john1337/article/details/103060820
關注微信公衆號,你還有頭髮嗎,獲取更多java軟件開發學習資源,覆蓋java基礎,android,網絡編程,併發編程,mysql,linux,算法,以及C++和python書籍資源。