如何保證kafka 的訊息機制

2021-08-13 17:36:06 字數 4002 閱讀 1325

1.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

for(int i=0;i<5;i++)

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,乙個消費者。這種場景和大資料應用場景相悖。

2.ack-fail 機制

建立:tuple--uuid--safdaljfdlsajfljalfdsal = 0000 0000 1010 0101

應答:tuple--uuid--safdaljfdlsajfljalfdsal = 0000 0000 1010 0101

建立:tuple1--uuid--dfsafsafdfsadsafd = 1000 1000 1010 0101

應答:tuple1--uuid--dfsafsafdfsadsafd = 1000 1000 1010 0101

建立:tuple2--uuid--ddafd = 1000 1000 0010 0101

建立:tuple3--uuid--dfsadsafdsafdsa = 1000 1001 0010 0101

建立:tuple4--uuid--dad = 1100 1000 0010 0101

建立:tuple5--uuid--dfs1212afsafdfsadsafdhg = 1000 1000 0010 0101

應答:tuple5--uuid--dfs1212afsafdfsadsafdhg = 1000 1000 0010 0101

應答:tuple2--uuid--ddafd = 1000 1000 0010 0101

應答:tuple3--uuid--dfsadsafdsafdsa = 1000 1001 0010 0101

應答:tuple4--uuid--dad = 1100 1000 0010 0101

0000 0000 1010 0101

0000 0000 1010 0101

-------------------

0000 0000 0000 0000  = 0 

1000 1000 1010 0101  

-------------------

1000 1000 1010 0101  = 1000

1000 1000 1010 0101

-------------------

0000 0000 0000 0000  = 0 

1000 1000 0010 0101

-------------------

1000 1000 0010 0101  = -1500

1000 1001 0010 0101  

------------------- 

0000 0001 0000 0000  = 121211  

1100 1000 0010 0101

-------------------

1100 1001 0010 0101  =  787878787

1000 1000 0010 0101

3.partition-broke 的關係

kafka01

paymentmq-1

paymentmq-4

kafka02

paymentmq-2

kafka03

paymentmq-0

paymentmq-3

int i = 0

list

for(int i=0;i<5;i++)

kafka01

paytest-2

paytest-5

paytest-8

kafka02

paytest-0

paytest-3

paytest-6

paytest-9

kafka03

paytest-1

paytest-4

paytest-7

paytest-10

三。**的方式

1.1  kafka 機制

2.ack-fail 原始碼跟蹤

kafka如何保證訊息有序

兩種方案 方案一,kafka topic 只設定乙個partition分割槽 方案二,producer將訊息傳送到指定partition分割槽 解析 方案一 kafka預設保證同乙個partition分區內的訊息是有序的,則可以設定topic只使用乙個分割槽,這樣訊息就是全域性有序,缺點是只能被co...

Kafka 如何保證訊息不會丟失

kafka 提供了資料高可靠的特性,但是如果使用不當,你可能無法享受到這一特性,今天我們就來看看如何正確的使用kafka 保證資料的不會丟失吧!kafka為生產者生產訊息提供了乙個send msg 方法,另有乙個過載的方法send msg,callback 當我們通過send msg,callbac...

kafka如何保證訊息不丟失

a 消費端弄丟了資料 關閉自動提交offset,在自己處理完畢之後手動提交offset,這樣就不會丟失資料。b kafka弄丟了資料 一般要求設定4個引數來保證訊息不丟失 給topic設定replication.factor引數 這個值必須大於1,表示要求每個partition必須至少有2個副本。在...