Kafka
人們通常有時會將 Kafka 中的 Topic 比作隊列;
?在 Kafka 中,數據是以主題(Topic)的形式組織的,每個 Topic 可以被分為多個分區(Partition)。每個 Partition 是一個有序的、不可變的消息序列,這與隊列的概念有些相似。
組件
一、Producer(生產者)
Kafka 為了提升消息發送速率,生產者默認采用批量發送的方式發送消息至 Broker;
?一條發送多少條由參數 batch.size 決定(默認16K);
?產生消息并將其發送給消息代理的應用程序或服務。生產者創建消息并將它們放入特定的消息隊列或主題中。生產者是創建并發送消息的實體。它可以是一個應用程序、服務或進程。
二、Broker(服務器)
Broker 就是 kafka 的服務器,用于存儲和管理消息,默認端口是9092;
?生產者和 Broker 建立連接,將消息發送到服務器上存儲起來;
?消費者跟 Broke r建立連接,訂閱和消費服務器上存儲的消息;
?消息處理中心。消息隊列系統的核心組件,負責接收、存儲和轉發消息。消息代理充當生產者和消費者之間的中介,確保消息能夠從一個地方安全的傳輸到另一個地方。
三、Consumer(消費者)
訂閱,接收消息的一方叫消費者;
?消費者獲取消息有兩種模式:Pull模式(拉)(消費者主動從消息隊列中獲取消息);Push模式(推)(Broker 把消息推送給消費者);
?Kafka 采用的是 Pull 模式,因為 Kafka 是支持大數據的,如果采用 Push 模式的話,海量數據可能把下游消費端給打爆,所以 Kafka 采用 Pull 模式推送消息;
?Pull 模式,消費者可以控制一次到底獲取多少條消息(max.pull.records 默認是500)。
四、Record(消息)
客服端傳輸的數據叫做消息,在 Kafka 中也叫 Record;
?Record 在客戶端是一個 KV 鍵值對(ProducerRecord,ConsumerRecord);
?Record 在服務端是一個 KV 鍵值對(RecordBatch(批量發送)或 Record)。
?實際的數據單位,可以是任何類型的信息,如文本、圖片等。
Topic(主題)
Topic 一個邏輯概念,可以理解為一組消息的集合;
?生產者和消費者通過 topic 進行消息的寫入和讀取;
?生產者發送消息時,若 topic 不存在,是否自動創建:auto.create.topics.enable(建議關閉);
?某些消息隊列系統支持 發布/訂閱 模型,在這種情況下,消息會被發送到一個主題而不是直接到隊列。多個消費者可以訂閱同一個主題以接收該主題下的所有消息。
Partition(分區)
就是把一個topic分成幾個不同的部分;
?一個topic在創建時可以劃分多個分區,若沒有指定,默認分區數為1,可通過參數修改(num.partitions);
?Kafka 中修改分區規則:可加,不可減。
Replica(副本機制)
和分區結合起來是Kafka實現高可用和負載均衡的原理
?Replica(副本)是 Partition(分區)的副本,每個分區可以有若干個副本(但是不能超過集群數量);
?副本必須在不同的Broker上,副本包括了主從節點(Leader,Foller);
?服務端可以通過參數控制默認副本數(offsets.topic.replication.factor)(一般不這樣用,一般直接通過命令設置副本數);
?生產者只會往 leader 節點發送消息,消費者也只會從 leader 節點讀取消息。
Segment(段)
Kafka 的數據文件是寫在 .log 文件里面的,另外一起還生成對應的索引 .index 文件和對應的時間 .timeIndex 文件;
但是很容易的可以理解,如果一直往一個log文件里面追加數據,那么長時間使用之后log文件的查找會隨著數據量變大而變慢,所以在這種情況下就引入了 Segment段 的概念;
Segment 的目的是:建一個分區的數據劃分、存儲到不同的文件中;
每個 Segment 至少由一個數據文件和2個索引文件構成,3個文件是成套出現的;
引入段的意義:加快查詢效率、刪除數據時減少逐條IO;
Segement 大小控制:按時間周期生成 log.roll.hours(默認一周)、按文件大小生產 log.segment.bytes(默認1G)。
Consumer Group(消費者組)
由于生產者可能短時間內生產大量消息,為了提升消息的消費速率,就增加了消費者組的概念(group id);
?使用消費者組,提升消費效率和吞吐量;
?同一個 Group 中的消費者,不能消費相同的分區(group id 相同,在一個組內)。
負載均衡:
? ? ? ? 在同一個消費者組內的消費者會自動分配主題中的分區。如果消費者的數量小于或等于主題的分區數,那么每個消費者將被分配到一個或多個分區;如果消費者的數量超過了分區的數量,那么多余的消費者將處于空閑狀態,不會接受任何消息
高可用性和容錯性:? ? ? ? 如果某個消費者失敗了或者停止運行,它的分區會被重新分配給組內的其它活躍消費者,確保消息繼續被處理,這被稱為再平衡(再平衡機制保證了即使有消費者假如或離開,整個組仍然能夠持續穩定的消費消息)
并行處理:? ? ? ? 通過增加同一消費者組中的消費者數量,可以提高對消息的并行處理能力。但是,最大并行度受限于主題的分區數,因為每個分區只能由一個消費者消費
消費進度跟蹤:? ? ? ? 每個消費者組維護自己的消費偏移量(Offset),記錄已經消費過的消息位置。kafka默認會定期提交這些偏移量,以確保在消費者重啟后可以從上次的位置繼續消費
獨立消費流:? ? ? ? 不同的消費者組可以獨立的消費相同主題的消息,而不會相互影響。這意味著一個主題的消息可以被多個不同的應用或服務同時消費。
Consumer Offset(偏移量)(Kafka,單分區消息順序消費的原因)
Kafka 在單分區里面的消息是順序存儲的;
?Offset(偏移量)的目的在于:記錄消費者的消費位置;
?Kafka 現行版本將 Offset 保存在服務器(__consumer_offsets_)主題中(0.9版本以前是在zooKeeper中)
隊列:存儲消息的地方,直到它們被消費者獲取(在某些情況下,隊列可以設置為持久化,以確保即使在系統故障后消息也不會丟失)