流式系统中最重要的保证:Exactly Once,即消息不会丢失,也不会被重复发送
在 Kafka 0.11 之前,开启重试机制只能保证数据不丢失,但是数据有可能有重复
在 Kafka 0.11 之后,可以实现数据的精准一次,它能保证多条消息原子性地写入到目标分区,即要不一起成功,要不都失败
主要靠两点:
- 事务型 Producer
- Consumer 只会成功提交的事务消息
1. 事务型 Producer
开启事务型 Producer 需要做以下 3 点:
- 设置
enable.idempotence = true
- 设置
transactional.id
- 发信息格式如下:
producer.initTransactions();
try {
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}
2.Consumer 只会成功提交的事务消息
设置 isolation.level = read_committed
,表明 Consumer 只会读取事务型 Producer 成功提交事务写入的消息