1. 程式人生 > >如何保證kafka 的訊息機制

如何保證kafka 的訊息機制

1、kafka是什麼
類JMS訊息佇列,結合JMS中的兩種模式,可以有多個消費者主動拉取資料,在JMS中只有點對點模式才有消費者主動拉取資料。
kafka是一個生產-消費模型。
Producer:生產者,只負責資料生產,生產者的程式碼可以整合到任務系統中。
資料的分發策略由producer決定,預設是defaultPartition Utils.abs(key.hashCode) % numPartitions
Broker:當前伺服器上的Kafka程序,俗稱拉皮條。只管資料儲存,不管是誰生產,不管是誰消費。
在叢集中每個broker都有一個唯一brokerid,不得重複。
Topic:目標傳送的目的地,這是一個邏輯上的概念,落到磁碟上是一個partition的目錄。partition的目錄中有多個segment組合(index,log)
一個Topic對應多個partition[0,1,2,3],一個partition對應多個segment組合。一個segment有預設的大小是1G。
每個partition可以設定多個副本(replication-factor 1),會從所有的副本中選取一個leader出來。所有讀寫操作都是通過leader來進行的。
特別強調,和mysql中主從有區別,mysql做主從是為了讀寫分離,在kafka中讀寫操作都是leader。
ConsumerGroup:資料消費者組,ConsumerGroup可以有多個,每個ConsumerGroup消費的資料都是一樣的。
可以把多個consumer執行緒劃分為一個組,組裡面所有成員共同消費一個topic的資料,組員之間不能重複消費。

2、kafka生產資料時的分組策略
預設是defaultPartition Utils.abs(key.hashCode) % numPartitions
上文中的key是producer在傳送資料時傳入的,produer.send(KeyedMessage(topic,myPartitionKey,messageContent))


3、kafka如何保證資料的完全生產
ack機制:broker表示發來的資料已確認接收無誤,表示資料已經儲存到磁碟。
0:不等待broker返回確認訊息
1:等待topic中某個partition leader儲存成功的狀態反饋
-1:等待topic中某個partition 所有副本都儲存成功的狀態反饋

4、broker如何儲存資料
在理論環境下,broker按照順序讀寫的機制,可以每秒儲存600M的資料。主要通過pagecache機制,儘可能的利用當前物理機器上的空閒記憶體來做快取。
當前topic所屬的broker,必定有一個該topic的partition,partition是一個磁碟目錄。partition的目錄中有多個segment組合(index,log)


5、partition如何分佈在不同的broker上
int i = 0
list{kafka01,kafka02,kafka03}

for(int i=0;i<5;i++){
brIndex = i%broker;
hostName = list.get(brIndex)
}

6、consumerGroup的組員和partition之間如何做負載均衡
最好是一一對應,一個partition對應一個consumer。
如果consumer的數量過多,必然有空閒的consumer。

演算法:
假如topic1,具有如下partitions: P0,P1,P2,P3
加入group中,有如下consumer: C1,C2
首先根據partition索引號對partitions排序: P0,P1,P2,P3
根據consumer.id排序: C0,C1
計算倍數: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
然後依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]


7、如何保證kafka消費者消費資料是全域性有序的
偽命題
如果要全域性有序的,必須保證生產有序,儲存有序,消費有序。
由於生產可以做叢集,儲存可以分片,消費可以設定為一個consumerGroup,要保證全域性有序,就需要保證每個環節都有序。
只有一個可能,就是一個生產者,一個partition,一個消費者。這種場景和大資料應用場景相悖。