
建網站原本是網站策劃師、網絡程序員、網頁設計師等,應用各種網絡程序開發技術和網頁設計技術配合操作的協同工作。創新互聯建站專業提供網站設計制作、成都做網站,網頁設計,網站制作(企業站、自適應網站建設、電商門戶網站)等服務,從網站深度策劃、搜索引擎友好度優化到用戶體驗的提升,我們力求做到極致!
主題 + 客戶端
發布訂閱的對象是主題(Topic)
向主題發布消息的客戶端應用程序稱為生產者(Producer),生產者可以持續不斷地向多個主題發送消息
訂閱這些主題消息的客戶端應用程序稱為消費者(Consumer),消費者能夠同時訂閱多個主題的消息
- 生產者和消費者統稱為客戶端
服務端
Kafka的服務端由被稱為Broker的服務進程構成,一個Kafka集群由多個Broker組成
Broker負責接收和處理客戶端發送過來的請求,以及對消息進行持久化
- 多個Broker進程能夠運行在同一臺機器上,但更常見的做法是將不同的Broker分散運行在不同的機器上
- 這樣如果集群中某一臺機器宕機了,即使在它上面運行的所有Broker進程都掛掉了
- 其他機器上的Broker也依然能夠對外提供服務,這是Kafka提供高可用的手段之一
備份
實現高可用的另一個手段是備份機制(Replication)
備份:把相同的數據拷貝到多臺機器上,這些相同的數據拷貝在Kafka中被稱為副本(Replica)
- 副本的數量是可以配置的,Kafka定義了兩類副本:領導者副本(Leader Replica)和追隨者副本(Follower Replica)
- 領導者副本:對外提供服務,對外指的是與客戶端程序進行交互
- 生產者總是向領導者副本寫消息
- 消費者總是從領導者副本讀消息
- 追隨者副本:被動地追隨領導者副本,不能與外界交互
- 向領導者副本發送請求,請求領導者副本把最新生產的消息發給它,進而與領導者副本保持同步
- MySQL的從庫是可以處理讀請求的
- Master-Slave => Leader-Follower
- 副本機制可以保證數據的持久化或者消息不丟失,但沒有解決伸縮性(Scalability)的問題
- 如果領導者副本積累了太多的數據以至于單臺Broker機器無法容納,該如何處理?
- 可以把數據分割成多份,然后保存在不同的Broker上,這種機制就是分區(Partitioning)
- MongoDB、Elasticsearch – Sharding
- HBase – Region
分區
Kafka中的分區機制是將每個主題劃分成多個分區(Partition),每個分區是一組有序的消息日志
生產者生產的每條消息只會被發送到一個分區中,Kafka的分區編號是從0開始的
副本是在分區這個層級定義的,每個分區下可以配置N個副本,只能有1個領導者副本和N-1個追隨者副本
生產者向分區(分區的領導者副本)寫入消息,每條消息在分區中的位置由位移(Offset)來表征,而分區位移總是從0開始
- 三層消息架構
- 第一層是主題層,每個主題可以配置M個分區,而每個分區又可以配置N個副本
- 第二層是分區層
- 每個分區的N個副本中只能有1個領導者副本,對外提供服務
- 其他N-1個副本是追隨者副本,只能提供數據冗余
- 第三層是消息層,分區中包含若干條消息,每條消息的位移從0開始,依次遞增
- 最后,客戶端程序只能與分區的領導者副本進行交互
持久化
- Kafka使用消息日志(Log)來保存數據,一個日志是磁盤上一個只能追加寫(Append-Only)消息的物理文件
- 只能追加寫入,避免了緩慢的隨機IO操作,改為性能較好的順序IO操作,這是實現Kafka高吞吐量的一個重要手段
- Kafka需要定期刪除消息以回收磁盤空間,可以通過日志片段(Log Segment)機制來實現
- 在Kafka底層,一個日志又被細分成多個日志段,消息被追加到當前最新的日志段中
- 當寫滿一個日志段后,Kafka會自動切分出一個新的日志段,并將老的日志段封存起來
- Kafka在后臺有定時任務定期地檢查這些老的日志段是否能夠被刪除,從而實現回收磁盤空間的目的
消費者
點對點模型(Peer to Peer,P2P):同一條消息只能被下游的一個消費者消費,其他消費者不能染指
- Kafka通過消費者組(Consumer Group)來實現P2P模型
- 消費者組:多個消費者實例共同組成一個組來消費一組主題
- 這組主題中的每個分區都只會被組內的一個消費者實例消費,其他消費者實例不能消費它
- 即消費者對分區有所有權
引入消費者組的目的:提高消費者端的吞吐量(TPS)
消費者實例(Consumer Instance):即可以是運行消費者應用的進程,也可以是一個線程
- 重平衡(Rebalance)
- 若組內的某個實例掛了,Kafka能夠自動檢測到,然后把這個掛掉的實例之前負責的分區轉移給組內其他存活的消費者
- 重平衡引發的消費者問題很多,目前很多重平衡的Bug社區都無力解決
- 消費者位移(Consumer Offset):記錄消費者當前消費到了分區的哪個位置,隨時變化
- 分區位移:表征的是消息在分區內的位置,一旦消息被成功寫入到一個分區上,消息的分區位移就固定了
小結

消息(Record):消息是Kafka處理的主要對象
主題(Topic):主題是承載消息的邏輯容器,實際使用中多用來區分具體的業務
分區(Partition):一個有序不變的消息序列,每個主題下有多個分區
消息位移(Offset):也叫分區位移,表示一條消息在分區中的位置,是一個單調遞增且不變的值
- 副本(Replica)
- Kafka中同一條消息能夠被拷貝到多個地方以提供數據冗余
- 副本分為領導者副本和追隨者副本,副本在分區的層級下,每個分區可配置多個副本實現高可用
生產者(Producer):向主題發布消息的應用程序
消費者(Consumer):從主題訂閱消息的應用程序
消費者位移(Consumer Offset):表征消費者的消費進度,每個消費者都有自己的消費者位移
消費者組(Consumer Group):多個消費者實例共同組成一個組,同時消費多個分區以實現高吞吐
- 重平衡(Rebalance)
- 消費者組內某個消費者實例掛掉后,其他消費者實例自動重新分配訂閱分區的過程
- 重平衡是Kafka消費者端實現高可用的重要手段
寫在最后
- 第一:看完點贊,感謝您的認可;
- ...
- 第二:隨手轉發,分享知識,讓更多人學習到;
- ...
- 第三:記得點關注,每天更新的?。。?/strong>
- ...

當前文章:Java程序員面試必備——kafka的專業術語
分享鏈接:
http://m.jcarcd.cn/article/pcpsjp.html