幂等
生产者会分配 生产者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 事务没有提交的消息也能读,默认语义