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確認收到訊息...