冪等
生產者會分配 生產者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 事務沒有提交的消息也能讀,默認語義