Kafka中的Message Delivary機制

2022-07-22 07:24:14 字數 1411 閱讀 5151

學習kafka的讀書筆記,暫未把文章設為翻譯型別,因為並非直譯文件。水平有限,還請路過高手指正。

<1> 「最多(傳送)一次」(at most once):訊息可以丟失但絕不會重新傳送;

<2> 「至少(傳送)一次」(at least once):訊息絕不會丟失但是可能會被重新傳送;

<3> 「僅(傳送)一次」(exactly once): 這是實際應用中最希望看到的,每個訊息只會被傳送一次且不會丟失;

從生產者角度,乙個producer可以選擇是否非同步傳送:

1> 若不選擇非同步傳送,producer在傳送乙個訊息之後得不到及時ack的話,會繼續重發,知道得到ack為止;(至少(傳送)一次)

2> 若選擇非同步傳送,producer在傳送乙個message後就繼續接下來的訊息傳送,而不管訊息是否最終傳送成功;(最多(傳送)一次)

從消費者角度,乙個kafka consumer有三種選擇:

1> 讀取n條訊息(一批訊息) ---> 儲存最後乙個訊息之後要處理的message possition至log ---> 處理訊息。 該流程保證「最多(傳送)一次」:如果儲存訊息position成功,但在處理訊息完成前consumer crash, 新的consumer程序將從記錄的position繼續往下處理,因而有訊息會被漏掉(未經處理).

2> 讀取n條訊息 (一批訊息)---> 處理訊息 ---> 記錄最後乙個訊息之後要處理的message possition至log。 該流程保證「至少(傳送)一次」:如果處理訊息過程中consumer crash, 新的consumer程序在接管時會從上一次處理的末尾position開始,一些訊息可能會被重發傳送。

3> 處理訊息過程中,將每個訊息的position和訊息本身存放在同一地方,要麼position和message都update, 要麼都沒有。該流程可保證「僅(傳送)一次」。當某個訊息處理失敗(consumer掛掉),新的consumer程序可以通過最後乙個處理的message position保證不會重複處理訊息。

總的來說,kafka預設支援「至少(傳送)一次」;

如果使用者希望支援「最多(傳送)一次」,可以在producer端選擇非同步傳送(關閉retry功能),並且在處理乙個批次訊息前先記錄該批次訊息最後乙個訊息的position。

若要實現「僅(傳送)一次」,kafka提供了message offset, consumer可以同步儲存每個訊息的offset和message本身,所以實現「僅(傳送)一次」比較方便。

push vs pull:

push model不能適應不同消費者的消費能力和使用場景。理解起來很簡單,消費者a每分鐘只能處理10條訊息,但broker可能以每分鐘100條的速率傳送給a,這顯然不合理。

pull-based model可以由消費者根據自身的處理能力選擇性的批處理訊息,可以減少不必要的延遲產生(每次通過網路傳送乙個訊息,會有會話延遲)

Kafka學習之旅 五 Kafka中的壓縮

kafka 會為我們保留一定量時間的資料那麼為kafka 選擇乙個合適的壓縮演算法是非常重要的,可以在節約儲存空間的同時又將效率影響到最低。在 kafka 中,壓縮可能發生在兩個地方 生產者端和 broker 端。生產者程式中配置 compression.type 引數即表示啟用指定型別的壓縮演算法...

Kafka科普系列Kafka中的事務是什麼樣子的

inittransactions 方法用來初始化事務 begintransaction 方法用來開啟事務 sendoffsetstotransaction 方法為消費者提供在事務內的位移提交的操作 committransaction 方法用來提交事務 aborttransaction 方法用來中止事...

Kafka科普系列Kafka中的事務是什麼樣子的

inittransactions 方法用來初始化事務 begintransaction 方法用來開啟事務 sendoffsetstotransaction 方法為消費者提供在事務內的位移提交的操作 committransaction 方法用來提交事務 aborttransaction 方法用來中止事...