kfafka的特性分析

一、kafka是什麼
類JMS消息隊列,結合JMS中的兩種模式(點對點模型,發佈者/訂閱者模型),能夠有多個消費者主動拉取數據,在JMS中只有點對點模式纔有消費者主動拉取數據。
kafka是一個生產-消費模型。mysql


Producer:生產者,只負責數據生產,生產者的代碼能夠集成到任務系統中。 
數據的分發策略由producer決定,默認是defaultPartition Utils.abs(key.hashCode) % numPartitions算法


Broker:當前服務器上的Kafka進程。只管數據存儲,無論是誰生產,無論是誰消費。
在集羣中每一個broker都有一個惟一brokerid,不得重複。sql


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的數據,組員之間不能重複消費。

二、kafka生產數據時的分組策略
默認是defaultPartition Utils.abs(key.hashCode) % numPartitions
上文中的key是producer在發送數據時傳入的,produer.send(KeyedMessage(topic,myPartitionKey,messageContent))服務器

三、kafka如何保證數據的徹底生產
ack機制:broker表示發來的數據已確認接收無誤,表示數據已經保存到磁盤。
0:不等待broker返回確認消息
1:等待topic中某個partition leader保存成功的狀態反饋
-1:等待topic中某個partition 全部副本都保存成功的狀態反饋

四、broker如何保存數據
在理論環境下,broker按照順序讀寫的機制,能夠每秒保存600M的數據。主要經過pagecache機制,儘量的利用當前物理機器上的空閒內存來作緩存。
當前topic所屬的broker,一定有一個該topic的partition,partition是一個磁盤目錄。partition的目錄中有多個segment組合(index,log),
但每一個段segment file消息數量不必定相等,這種特性方便old segment file快速被刪除。默認保留7天的數據。併發

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

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

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

算法:負載均衡

當一個group,consumer加入或者離開時,會觸發partitions均衡.均衡的最終目的,是提高topic的併發消費能力,步驟以下:ide

一、 假如topic1,具備以下partitions: P0,P1,P2,P3大數據

二、 加入group,有以下consumer: C1,C2spa

三、 首先根據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)]

 

七、如何保證kafka消費者消費數據是全局有序的
僞命題
若是要全局有序的,必須保證生產有序,存儲有序,消費有序。
因爲生產能夠作集羣,存儲能夠分片,消費能夠設置爲一個consumerGroup,要保證全局有序,就須要保證每一個環節都有序。
只有一個可能,就是一個生產者,一個partition,一個消費者。這種場景和大數據應用場景相悖。


數據有序的討論?
一個partition的數據是不是有序的? 間隔性有序,不連續
針對一個topic裏面的數據,只能作到partition內部有序,不能作到全局有序。
特別加入消費者的場景後,如何保證消費者消費的數據全局有序的?僞命題。

只有一種狀況下才能保證全局有序?就是隻有一個partition。

相關文章
相關標籤/搜索