kafka模块概述
簡介
- kafka主要用于實現低延遲的發送和收集大量的事件和日志數據--通常是活躍的數據(PV、訪問記錄等),數據以日志形式記錄下來,然后由一個專門的系統來進行日志的收集與統計;
- 吞吐量極高的分布式消息系統,典型的發布訂閱模式系統;
- kafka集群,沒有中心節點的概念,可以在不做任何配置修改的情況下添加和刪除服務器,同樣,消息的生產者、消費者可以隨意重啟、上下線;
Broker注冊
- Broker是分布式部署,且相互獨立,通過注冊系統ZooKeeper綜合管理,ZooKeeper上Broker服務器列表記錄節點路徑:/brokers/ids,Broker啟動時會到ZooKeeper注冊,創建屬于自己的節點:/broker/ids/[0...N],將自己的IP地址和端口信息寫入該節點中;
- Broker創建的節點為臨時節點,一旦Broker服務器宕機or下線,對應的Broker節點會被刪除,因此可以通過ZooKeeper上的Broker節點的變化情況來動態表征Broker服務器的可用性;
Topic注冊
- kafka中,同一個Topic消息鳳城多個分區并分布到多個Broker上,這些分區信息與Broker的對應關系由ZooKeeper維護,對應節點:/brokers/topics,每一個Topic,都會有節點:/brokers/topics/[topic],如:/brokers/topics/loginlogs;
- Broker服務啟動后,會到對應的Topic節點下注冊自己的Broker ID,并寫入針對該Topic的分區總數,如:/brokers/topics/loginlogs/3 ->2,表明Broker ID為3的一個Broker服務器,對于loginlogs這個Topic消息,提供了2個分區進行消息存儲。同樣,這個分區書節點也是臨時的;
生產者負載均衡
- 生產者需要合理的發送消息到分布式的Broker上,所以面臨生產者負載均衡的問題。
- kafka支持傳統的四層負載均衡,同時支持使用ZooKeeper來實現負載均衡。
此方案設計教簡單,根據生產者的IP與端口來為其確定一個關聯的Broker,通常一個生產者只會對應一個Broker,該生產者所有消息都發送給該Broker。此方案設計簡單,不需要引入其他第三方系統,同時生產者不需要同其他系統建立額外的TCP連接,只需要維護和Broker的單個TCP鏈接即可
弊端很明顯,無法做到真正的負載均衡,實際運行中,每個生產者生成的消息量,以及每個Broker的消息存儲量都不一樣,導致不同Broker接收到的消息不均勻。另方面,生產者也無法感知到Broker的新增與刪除,因此,該方案無法做到動態的負載均衡。
2. 使用ZooKeeper進行負載均衡
kafka中,客戶端使用了基于ZooKeeper的負載均衡策略來解決生產者的負載均衡問題。前面介紹,每當Broker啟動時,會首先完成Broker的注冊過程,并注冊一些“有哪些可訂閱的Topic”?的元數據信息。
kafka的生產者會對ZooKeeper上的以下事件注冊Watcher監聽,來實現一種動態的負載均衡機制:
Broker的新增與減少
Topic的新增與減少
Broker與Topic關聯關系的變化
?消費者負載均衡
與生產者類似,消費者也需要進行負載均衡來實現多個消費者合理的從對應的Broker服務器上接受消息。每一條消息都會發送給分組中的一個消費者,即同一個消費者分組內部的消息消費策略。
- 消息分區與消費者關系
每個消費者分組,都會有唯一的Group ID,每個消費者也有唯一的Consumer ID,通常為‘Hostname:UUID’;
kafka設計規定,每個消息分區有且只能同時有一個消費者對其進行消息的消費,因此需要在ZooKeeper上記錄下消息分區與消費者之間的關系;
消費者確定了對一個消息分區的消費權利,需將其Customer ID寫入對應的消息分區的臨時節點上,如:/consumers/[group_id]/owns/[topic]/[broker_id-partition_id],broker_id-partition_id為一個消息的分區標識,節點內容即該分區對應的消費者Consumer ID;
- 消息消費進度Offset記錄
節點路徑:/consumers/[group_id]/offsets/[topic]/[broker_id-partitiion_id],節點內容即Offset的值;以便該消費者重啟或其他消費者接管該消息分區后,能夠從之前的進度繼續開始
- 消費者注冊
1. 注冊到消費者分組
消息者服務啟動,會注冊:/consumers/[group_id]/ids/[consumers_id],節點創建完后,會將自己訂閱的Topic信息寫入該節點,此節點也為臨時節點;
2. 對消費者分組中消費者的變化注冊監聽
對/consumers/[group_id]ids節點注冊子節點變化的watcher監聽,一旦發現消費者新增減少,就會觸發消費者的負載均衡;
3. 對Broker服務器的變化注冊監聽
對/brokers/ids/[0...N]中節點注冊監聽,Broker服務器發生變化,根據情況決定是否進行消費者負載均衡;
4. ?進行消費者負載均衡
轉載于:https://www.cnblogs.com/binnzhao/p/6055495.html
總結
- 上一篇: JSBing-js自动绑定C++
- 下一篇: 3.Android 优化布局(解决Tex