Kafka 一次性語義實現

冪等

生產者會分配 生產者ID,序列號
pid,seq
broker 維護<Pid,分區> 的序列號

新序列號=老序列號+1 接受
新序列號<老序列號+1 丟棄,證明數據重複了
新序列號>老序列號+1 拋出亂序異常,證明中間的數據丟失了

只能處理單個topic,單分區的,消息不重複

事務

保證了原子性,所有的消息要麼全部成功,要麼全部失敗
生產者配置

//冪等
producerProps.put("enable.idempotence", "true");
//事務ID
producerProps.put("transactional.id", "prod-1");

//初始化
producer.initTransactions();
try{
//開始
 producer.beginTransaction();
    producer.send(record0);
    producer.send(record1);
    //提交
    producer.commitTransaction();
} catch( ProducerFencedException e) {
    producer.close();
} catch( KafkaException e ) {
    producer.abortTransaction();
}

消費者配置

//不自動提交
consumerProps.put("enable.auto.commit", "false");
//事務隔離級別,必須爲這個
consumerProps.put("isolation.level", "read_committed");

Kafka 事務隔離級別
read_committed 事務提交的消息才能讀
read_uncommitted 事務沒有提交的消息也能讀,默認語義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章