1. 程式人生 > >Kafka 溫故(二):Kafka的基本概念和結構

Kafka 溫故(二):Kafka的基本概念和結構

partition long 先後 導致 topic 創建 -c 標示 文件的

一.Kafka中的核心概念

Producer: 特指消息的生產者
Consumer :特指消息的消費者
Consumer Group :消費者組,可以並行消費Topic中partition的消息
Broker:緩存代理,Kafa 集群中的一臺或多臺服務器統稱為 broker。
Topic:特指 Kafka 處理的消息源(feeds of messages)的不同分類。
Partition:Topic 物理上的分組,一個 topic 可以分為多個 partition,每個 partition 是一個有序的隊列。partition 中的每條消息都會被分配一個有序的 id(offset)
Message:消息,是通信的基本單位,每個 producer 可以向一個 topic(主題)發布一些消息

Producers(是個動詞):消息和數據生產者,向 Kafka 的一個 topic 發布消息的過程叫做 producers
Consumers(是個動詞):消息和數據消費者,訂閱 topics 並處理其發布的消息的過程叫做 consumers

二.Kafka的邏輯架構

技術分享圖片

註:當一個Topic中消息過多時,會對Topic進行分區處理,把消息分到不同的Partition中。

為什麽要分區:
是為了對大量的數據進行分而治之,把數據分區,不同的Consumer可以消費不同分區的數據,不同Consumer對數據的消費可以做成並行的,這樣可以加快數據處理的速度。

消息發送的流程:
1.Producer根據指定的partition方法(round-robin、hash等),將消息發布到指定topic的partition裏面

2.kafka集群接收到Producer發過來的消息後,將其持久化到硬盤,並保留消息指定時長(可配置),而不關註消息是否被消費。
3.Consumer從kafka集群pull數據,並控制獲取消息的offset

三.Kafka的Producers

1.producers定義:
消息和數據生產者,向 Kafka 的一個 topic 發布消息的過程叫做 produces

2.可指定消息的partition:
Producer將消息發布到指定的Topic中,同時Producer也能決定將此消息歸屬於哪個partition(即:生產者可以指定將發送的消息放在一個topic中的partition1,還是partition2中)(註:這種機制可以理解為一種變相的負載均衡,輪轉);比如基於"round-robin"方式或者通過其他的一些算法等()

3.異步發送:
kafka支持異步批量發送消息。批量發送可以很有效的提高發送效率。Kafka producer的異步發送模式允許進行批量發送,先將消息緩存在內存中,然後一次請求批量發送出去

四.Kafka的broker

1.Broker:(可以把Broker理解為Kafka的服務器)緩存代理,Kafka 集群中的一臺或多臺服務器統稱為 broker。
註:
kafka中支持消息持久化的,生產者生產消息後,kafka不會直接把消息傳遞給消費者,而是先要在broker中進行存儲,持久化是保存在kafka的日誌文件中。

2.Message在Broker中通Log追加(即新的消息保存在文件的最後面,是有序的)的方式進行持久化存儲。並進行分區(patitions)

3.為了減少磁盤寫入的次數,broker會將消息暫時buffer起來,當消息的個數(或尺寸)達到一定閥值時,再flush到磁盤,這樣減少了磁盤IO調用的次數。

五.Kafka的broker無狀態機制

1. Broker沒有副本機制,一旦broker宕機,該broker的消息將都不可用。

註:Broker沒有副本,那broker宕機了怎麽解決?
雖然broker沒有副本,但是消息本身是有副本的,不會丟失。Broker只要在宕機後再讀取消息的日誌就行了

2. Broker不保存訂閱者的狀態,由訂閱者自己保存

3. 無狀態導致消息的刪除成為難題(可能刪除的消息正在被訂閱),kafka采用基於時間的SLA(服務水平保證),消息保存一定時間(通常為7天)後會被刪除。

4. 消息訂閱者可以rewind back到任意位置重新進行消費,當訂閱者故障時,可以選擇最小的offset(id,即偏移量)進行重新讀取消費消息。

註:1.消費者是如何確定,那條消息應該消費,那條消息已經消費了?
Zookeeper會幫助記錄那條消息已經消費了,那條消息沒有消費

2.消費者是如何快速的找到它沒有消費的消息呢?
這個實現就要靠kafka中 “稀疏索引”

六.Kafka的Message的組成

1.Message消息:
是通信的基本單位,每個 producer 可以向一個 topic(主題)發布一些消息

2.Kafka中的Message是以topic為基本單位組織的,不同的topic之間是相互獨立的。每個topic又可以分成幾個不同的partition(每個topic有幾個partition是在創建topic時指定的),每個partition存儲一部分Message。

3.partition中的每條Message包含了以下三個屬性:
offset(偏移量,即消息的唯一標示,通過它才能找到唯一的一條消息)
對應類型:long
MessageSize 對應類型:int32
data 是message的具體內容

註:1.消息是無狀態的,消息的消費先後順序是沒有關系的
2.每一個partition只能由一個consumer來進行消費,但是一個consumer是可 以消費多個partition,是一對多的關系

七.Kafka的Partition的分區的目的

1.kafka基於文件存儲.通過分區,可以將日誌內容分散到多個server上,來避免文件尺寸達到單機磁盤的上限,每個partiton都會被當前server(kafka實例)保存;

2.可以將一個topic切分多任意多個partitions,來消息保存/消費的效率.

3.越多的partitions意味著可以容納更多的consumer,有效提升並發消費的能力.

八.Kafka的Consumers

Ø消息和數據消費者,訂閱 topics 並處理其發布的消息的過程叫做 consumers。 Ø在 kafka中,我們 可以認為一個group是一個“訂閱者”,一個Topic中的每個partions,只會被一個“訂閱者”中的一個consumer消費,不過一個 consumer可以消費多個partitions中的消息(消費者數據小於Partions的數量時) Ø Ø註: kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,否則將意味著某些consumer將無法得到消息. 技術分享圖片

Kafka 溫故(二):Kafka的基本概念和結構