Kafka 如何保證訊息不會丟失

2021-09-29 22:32:40 字數 1911 閱讀 1461

kafka 提供了資料高可靠的特性,

但是如果使用不當,

你可能無法享受到這一特性,

今天我們就來看看如何正確的使用kafka 保證資料的不會丟失吧!

kafka為生產者生產訊息提供了乙個send(msg)方法,

另有乙個過載的方法send(msg, callback),

當我們通過send(msg, callback)是不是就意味著訊息一定不丟失了呢?

答案明顯是:不是的

我們接著上面,

send(msg, callback)裡面callback返回的成功,

到底是不是真的確保訊息萬無一失了?

其實這個返回的成功也是可以在生產者配置的:

properties props = new properties();

props.put("bootstrap.servers", "localhost:9092");

//*******重點*****************

props.put("acks", "all");

props.put("key.serializer", "org.apache.kafka.common.serialization.stringserializer");

props.put("value.serializer", "org.apache.kafka.common.serialization.stringserializer");

producerproducer = new kafkaproducer<>(props);

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

producer.send(new producerrecord("my-topic", integer.tostring(i), integer.tostring(i)));

producer.close();

這段**是生產者傳送訊息的乙個例子,

其中沒使用callback主要是這裡callback不是重點,

我們的重點是props.put("acks", "all");

這個acks配置屬性就是我們callback成功的具體含義:

其實到這裡,生產者端基本已經做好了資料不丟失的大部分準備,

但是有些東西是要配合 broker 端一起,

才能達到預期的不丟失資料的,

比如我們上面說到的

unclean.leader.election.enable

這裡 broker 端還有乙個重要的配置就是unclean.leader.election.enable = false

這個配置代表著一些資料落後比較多的 follower,

是否能在leader宕機後被選舉成新的 leader

如果你設定成 true,

很明顯,如果這樣的follower成為新leader,

就會造成最新的一部分資料丟失掉,

上面已經基本完成了不丟資料的方方面面了,

但是有些東西不是我們能控制的,

比如 網路抖動 等不可抗拒的因素,

這時候重試次數就很關鍵了,

配置合適的retries重試次數,

和 合適的retry.backoff.ms重試間隔時間,

將為我們的資料傳送提供更高的穩定性,

當然如果實在傳送不成功,怎麼辦呢?

一般我們也可以把傳送不成功的資料儲存在乙個日誌檔案,

如果資料很重要,那就傳送警告資訊,

人工干預一下。

kafka如何保證訊息不丟失

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

如何保證kafka訊息不丟失

這裡的kafka值得是broker,broker訊息丟失的邊界需要對齊一下 1 已經提交的訊息 2 有限度的持久化 如果訊息沒提交成功,並不是broke丟失了訊息 有限度的持久化 broker可用 producer.send object msg 這個傳送訊息的方式是非同步的 fire and fo...

kafka保證訊息不丟失

一 消費端保證訊息不丟失 消費端從broker取到訊息以後,先處理業務邏輯,然後再手動提交,這樣就可以避免消費端訊息丟失。二 生產端訊息不丟失 首先是設定每個訊息分割槽的副本,一本是幾個broker就配置幾個分割槽,然後設定如下,保證生產這生產的訊息傳送到broker時,不但leader確認收到訊息...