5 Kafka訊息可靠性

2021-10-09 00:00:14 字數 1520 閱讀 7634

在訊息中介軟體裡,有乙個非常重要的問題就是怎麼保證訊息不丟失,而這就是訊息的可靠性問題。

(1) acks

這個引數用於控制producer生產訊息的永續性。當一條訊息被提交,只要有任何乙個副本儲存了該訊息,並且副本存活,那麼就可以認為該訊息是不可丟失的。當producer傳送一條訊息給kafka集群時,這條訊息會被傳送到指定topic分割槽的leader所在的broker上,producer等待該broker返回訊息的寫入結果以確定訊息被成功提交。broker什麼時候會傳送寫入結果給producer呢?那就是acks引數的作用了。具體來說,acks有3個值:0,1和all。

acks設定成0表示producer不管broker端返回的結果,雖然這種方式可用性最低,但是卻是響應時間最低的。在不在乎是否丟訊息的情況下,可以將acks設定成0。

acks設定成all表示當傳送訊息時,broker不僅會將訊息寫入本地日誌,同時還會等待isr中的所有其他副本都成功寫入後,才傳送響應結果給produer,那麼當acks設定為all時,只要isr中有乙個副本是存活的,那麼這條訊息就不會丟失,因此可以達到最高的訊息可用性,但是這種情況下延時也是最高的。

acks設定成1時,表示當producer傳送訊息後,broker僅將訊息寫入本地日誌,就傳送響應結果給producer,而不會等待isr中其他副本寫入訊息,那麼這個時候,只要leader的broker一直存活,kafa就能保證該訊息不會丟失。這種方案既能達到一定的訊息可靠性,也能降低一些延時。

(2)retries

broker在處理寫入請求時可能因為各種問題導致寫入失敗,那麼就需要重試保證訊息的可靠性,該引數就是produer端的重試次數。如果想要保證訊息的不丟失,就要把retries引數設定為integer.max_value。

(3)max.in.flight.requests.per.connection

當我們設定retries引數為乙個比較大的值的時候,就可能出現訊息的亂序問題,為了防止這個問題的出現,我們需要設定該引數為1。這個引數就是限制了producer在單個broker連線上能夠傳送的未響應請求的數量。因此,如果設定成1,則producer在broker傳送響應之前將無法再給該broker傳送請求。

(1)session.timeout.ms

該引數是consumer group內成員檢測的時間,也就是說,如果consumer group中某個成員突然無法提供服務了,消費者的協調者要多長時間才能檢測到該成員無法提供服務。當協調者檢測到成員無法提供服務後,將開啟rebalance來進行重新分配訊息。

(2)max.poll.interval.ms

該引數是consumer處理邏輯的最大時間。當使用者的業務處理需要2分鐘的時間,那麼使用者只需要把max.poll.interval.ms設定為大於2分鐘即可。

(3)enable.auto.commit

該引數指定conmsuer是否自動提交offset。如果是true,則consmer會自動提交offset,否則使用者需要手動提交offset。如果要保證訊息的可靠性,那麼需要將引數引數設定為false,由使用者來手動提交offset,保證consumer能夠正確的消費該訊息。

Kafka訊息可靠性

如果mq沒有類似資料庫事務結構和保證,是不可能達到訊息投遞100 可靠的,極端情況下訊息投遞要麼丟失或重複。下面咋們從producer,broker,consumer的角度分析一下kafka中會出現哪些情況。目前生產者傳送訊息 request.required.acks 有三種方式。acks 0 p...

kafka 九 Kafka訊息的可靠性

沒有乙個中介軟體能夠做到百分之百的完全可靠,可靠性更多的還是基於幾個9的衡量指標,比如4個9 5 個9.軟體系統的可靠性只能夠無限去接近100 但不可能達到100 所以kafka如何是實現最大可能的可靠性呢?你可以建立更多的分割槽來提公升可靠性,但是分割槽數過多也會帶來效能上的開銷,一般來說,3個副...

Kafka 訊息交付可靠性保障

所謂的訊息交付可靠性保障,是指 kafka 對 producer 和 consumer 要處理的訊息提供什麼樣的承諾。常見的承諾有以下三種 目前,kafka 預設提供的交付可靠性保障是 至少一次。訊息 已提交 的含義為 只有 broker 成功 提交 訊息且 producer 接到 broker 的...