Kafka 之 如何保證數據不丟失?不重復?


見:https://www.cnblogs.com/sabertobih/p/14092290.html

數據不丟失

1)從生產端:acks = -1,(ack應答機制)從生產端到節點端,當所有isr集合里的節點備份完畢后返回成功;

2)從節點端:每個partition至少需要一個isr節點(同步)存活保證數據安全

3)從消費端:關閉自動提交,使用手動提交。

數據不重復消費

1)生產端

生產者冪等性實現:PID和Sequence Number
為了實現Producer的冪等性,Kafka引入了Producer ID(即PID)和Sequence Number。 PID:每個新的Producer在初始化的時候會被分配一個唯一的PID,這個PID對用戶是 不可見的。
Sequence Numbler:(對於每個PID,該Producer發送數據的每個<Topic, Partition> 都對應一個從0開始單調遞增的Sequence Number。
Broker端在緩存中保存了這seq number,對於接收的每條消息,如果其序號大於Broker 緩存中序號則接受它,否則將其丟棄。這樣就可以避免消息重復提交了。

但是,只能保證單個Producer對於同一個<Topic, Partition>的Exactly Once語義。不能保證同一個Producer一個topic不同的partion冪等。

2)消費端

消費者冪等處理:

1.將消息的offset存在消費者應用中或者第三方存儲的地方
可以將這個數據存放在redis或者是內存中,消費消息時,如果有這條數據的話,就不會去做后續操作
2.數據落庫的時候,根據主鍵去過濾
在落庫時,如果不不在這條數據,則去新增,如果存在則去修改

如果不能冪等處理,則將consumer的提交方式設置為同步提交,是最大程度地保證一致性的方法,缺點是性能會降低很多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM