一、Kafka是由Apache軟件基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分佈式發佈訂閱消息系統,它可以處理消費者在網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了通過集羣來提供實時的消息。
二、消息隊列的流派
1.什麼是 MQ
Message Queue (MQ),消息隊列中間件。很多人都說:MQ通過將消息的發送和接收分離來實現應用程序的異步和解耦,這個給人的直覺是MQ 是異步的,用來解耦的,但是這個只是 MQ 的效果而不是目的。MQ 真正的目的是爲了通訊,屏蔽底層複雜的通訊協議,定義了一套應用層的、更加簡單的通訊協議。一個分佈式系統中兩個模塊之間通訊要麼是 HTTP,要麼是自己開發的 (rpc) TCP,但是這兩種協議其實都是原始的協議。HTTP 協議很難實現兩端通訊,TCP 就更加原始了,粘包、心跳、私有的協議,想一想頭皮就發麻。MQ 所要做的就是在這些協議之上構建一個簡單的“協議”——生產者/消費者模型。
MQ 帶給我的“協議"不是具體的通訊協議,而是更高層次通訊模型。它定義了兩個對象。——發送數據的叫生產者:接收數據的叫消費者,提供一個SDK 讓我們可以定義自己的生產者和消貴者實現消息通訊而無視底層通訊協議。
2.常用消息隊列
- rabbitMQ
- roketMQ
- kafka
- zeroMQ
三、爲什麼使用消息隊列
1.目的:解耦、異步、削峯
2.說明:解耦:爲了減少業務層面的邏輯耦合性,缺點增加了系統的複雜性和節點指點的風險值。異步:相對於同步導致的時間等待,異步更加有效的緩解阻塞的問題。削峯:當數據量比較大的時候,計算量有限的情況下,如果硬塞給處理的應用,很有可能導致內存溢出等問題,那麼通過queue現有的處理能力來來取數據,即保證了執行的效率,也保證了數據不丟失。
四、爲什麼選擇kafka
1.分佈式
2.數據以磁盤方式存在,O(1)的查詢時間
3.高吞吐
4.支持分區消息
五、基本概念
1.主題(topic)
可以看着一類數據的集合的名稱
2.分區(partition)
將一個topic的消息分區來存儲:
- 分區存儲可以解決文件過大問題。
- 提供更高的吞吐量
3.副本(replicas)就是分區備份的意思
- 副本會有一個leader,多個follower。
- kafka的讀寫都發生在leader上,然後把數據同步到follower。如果leader掛了,會從follower中選舉leader。
- ISR:一個集合同步和已同步的集合。如果節點性能較差,會被ISR剔除集合。
4.偏移量
- offset可以理解爲已經被消費的下標。
- 消息消費出現異常的時候,記錄消費的下標值,當服務正常消費的時候,可以通過這個位置在進行消費,這種方式可以理解爲偏移量。
- 偏移量屬於,消費者概念。在消費者眼中,可以自由的設置消費位置,以及消費的順序。
5.順序消費
- 如果只有一個分區,默認就是順序消費的。
- 如果多個分區的時候,可以指定分區進行生產和消費,當然,也會損失性能。
六、機制
1.controller: 每個broker啓動的時候都會在zookeeper創建一個臨時節點,最小標號的爲這個集羣的controller。
- 在集羣中如果一個副本的leader掛了,會從副本中選擇leader,遵從最左原則。
- 新增或者減少broker的時候,controller會同步給其他broker。
- 分區增加或者較少也會同步給其他broker
2.rebalance機制
- 前提:消費者沒有指明消費分區。
- 觸發條件:當消費者或者分區數量發生變化時。
- 機制:重新調整消費者消費那個分區
- 消費分區策略:range(計算),輪詢,sticky(在原來不變的基礎上進行修改)
3.LEO
- 表示下一個寫入的位置。
4.HW
- HW被稱爲高水位,HighWatermark的縮寫。在partition中取一個LEO(log-end-offset)作爲HW,那麼消費者就之多智能消費到HW的位置。
- 每個replica都存在HW,leader和follower各執維護自己的HW。對於leader新寫入的數據要等ISR中的replicas同步更新到HW後,在被消費者消費。這個爲了保證leader所在的broker掛了,replicas重新選舉leader,也可以被消費。