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 事务没有提交的消息也能读,默认语义

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