kafka作為訊息佇列,一定會有訊息丟失和訊息重複的問題,那什麼場景下會出現這種情況呢?
kafka有乙個引數叫做acks
。
當生產者向leader傳送訊息後,會返回乙個確認的訊息給生產者。
但是什麼時候leader會傳送確認訊息返回給生產者呢?就是通過acks這個引數決定的,這個引數有三種情況0
、1
、-1
0:就是不用leader傳送確認訊息,生產者直接傳送訊息資料給leader。這種情況就會容易傳送訊息丟失。
1:就是leader不用等所有的follower同步後才傳送確認訊息後,生產者才傳送訊息資料給leader。這種情況比上一種可靠一點。
-1:就是leader必須等所有的follower同步完成後才能傳送確認訊息給生產者,這個時候生產者才會傳送訊息資料。
acks引數設定為1的時候。
當leader接收到生產者傳送過來的訊息時,不需要等待follower同步,返回確認訊息,生產者傳送訊息helloa,leader接收到到訊息,並沒有同步follower,這個時候leader掛掉了,follower選舉出新的leader,這個時候因為已經接收到確認訊息,所以不會再傳送helloa,會傳送下一條訊息hellob,這樣我們就丟失了helloa這條訊息。
acks引數設定為-1的時候。當leader接收到生產者傳送過來的訊息helloa時,則等待follower同步,才能返回確認訊息,但是這個時候leader掛掉了,follower選舉出新的leader,沒有傳送確認訊息給生產者,所以生產者還會傳送helloa這條訊息,但是helloa已經同步到所有的follower了,這樣就發生了訊息重複的情況了。
Kafka 訊息丟失和訊息重複消費
producer 的acks引數值設定為 0 或者 1 不等待伺服器確認或者只讓leader確認解決方法 將acks的值設定為all或者 1,讓leader和followers全部進行確認 producer 沒有設定失敗重試解決方法 根據實際場景將retries引數值設定為正整數 consumerp...
Kafka 訊息丟失和訊息重複消費
producer 的acks引數值設定為 0 或者 1 不等待伺服器確認或者只讓leader確認解決方法 將acks的值設定為all或者 1,讓leader和followers全部進行確認 producer 沒有設定失敗重試解決方法 根據實際場景將retries引數值設定為正整數 consumerp...
RabbitMQ 重複消費 資料丟失和訊息順序性
1 保證訊息不被重複消費的關鍵是保證訊息佇列的冪等性,這個問題針對業務場景來答分以下幾點 生產者的訊息沒有投遞到mq中怎麼辦?從生產者弄丟資料這個角度來看,rabbitmq提供transaction和confirm模式來確保生產者不丟訊息。transaction機制就是說,傳送訊息前,開啟事物 ch...