kafka
組件
broker
kafka集羣中包含一個或多個服務器,服務器節點爲broker
broker存儲topic的數據。如果某topic有N個partition,集羣有N個broker,那麼每個broker存儲該topic的一個partition。
如果某topic有N個partition,集羣有(N+M)個broker,那麼其中有N個broker存儲該topic的一個partition,剩下的M個broker不存儲該topic的partition數據。
如果某topic有N個partition,集羣中broker數目少於N個,那麼一個broker存儲該topic的一個或多個partition。在實際生產環境中,儘量避免這種情況的發生,這種情況容易導致Kafka集羣數據不均衡。
每條發佈到Kafka集羣的消息都有一個類別,這個類別被稱爲Topic。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存於一個或多個broker上但用戶只需指定消息的Topic即可生產或消費數據而不必關心數據存於何處)
類似於數據庫的表名
Partition
topic中的數據分割爲一個或多個partition。每個topic至少有一個partition。每個partition中的數據使用多個segment文件存儲。partition中的數據是有序的,不同partition間的數據丟失了數據的順序。如果topic有多個partition,消費數據時就不能保證數據的順序。在需要嚴格保證消息的消費順序的場景下,需要將partition數目設爲1。
producer
生產者即數據的發佈者,該角色將消息發佈到Kafka的topic中。broker接收到生產者發送的消息後,broker將該消息追加到當前用於追加數據的segment文件中。生產者發送的消息,存儲到一個partition中,生產者也可以指定數據存儲的partition。
consumer
消費者可以從broker中讀取數據。消費者可以消費多個topic中的數據。
consumer group
每個Consumer屬於一個特定的Consumer Group(可爲每個Consumer指定group name,若不指定group name則屬於默認的group)。
leader
每個partition有多個副本,其中有且僅有一個作爲Leader,Leader是當前負責數據的讀寫的partition。
follower
Follower跟隨Leader,所有寫請求都通過Leader路由,數據變更會廣播給所有Follower,Follower與Leader保持數據同步。如果Leader失效,則從Follower中選舉出一個新的Leader。當Follower與Leader掛掉、卡住或者同步太慢,leader會把這個follower從“in sync replicas”(ISR)列表中刪除,重新創建一個Follower。
總結
1,一條消息最終落入到某個主題的某個分區
2,客戶端
生產者
消費者
3,生產者
消息的區分選擇
a、null key:輪詢所有分區,負載均衡
b、key:hash(key)%分區數
c、指定分區:如果使用這種情況,那麼以上兩者無效
d、自定義分區:取決於如何實現
消息的成功發送
a、不等待集羣的反饋
-1
b、等待集羣的反饋:按照ack來確認消息是否發送成功
1
0:等待leader的反饋
all:等待所有副本的反饋
4、消費者
重複消費
a、重複消費:不同消費組
b、不重複消費:同一個消費組
不會在同一時刻,同一組內,多個消費者同時消費數據
一個分區的數據,只能交給一個消費者消費
一個消費者,可以消費多個分區中的數據,可以誇主題
負載均衡
a、儘可能的將多個分區,分配給不同的消費者消費
消費順序
a、保證一個分區中的數據消費過程是有序的
手段:
將所有數據指定到某個分區中
只設置一個分區
API
producerAPI
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(properties);
comstomAPI
KafkaProducer<String,String> producer = new KafkaProducer<>(props)
分區API
接口org.apache.kafka.clients.producer.Partitioner
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster)
攔截器API
接口org.apache.kafka.clients.producer.ProducerInterceptor
onSend()處理消息
onAcknowledgement()處理返回消息
kafkaStreamsAPI
接口org.apache.kafka.streams.processor.Processor<byte[],byte[]>
init(ProcessorContext context)
process(byte[] key,byte[] value)每條數據
context.forward
puctuate(long timestamp)週期性