Kafka在0.11版本开始引入幂等和事务的特性
幂等
- 简单来说就是,无论我新增多少条数据,结果都是一条。
- 对于Kafka来说,通过producer id(PID)和序列号sequence number来实现。每个producer都有一个pid,当他们往分区发送消息时,会携带一个sequence number,这个序列号是递增的。当一个producer多次发送一个数据时,这个数据的sequence number是一样的。此时Kafka的broker,只会接受第一次发送的数据(在broker里,会为每个producer他们所对应的分区维护一个序列号的值SN_old,当SN_new = SN_old+1时,broker才会接受此数据)。
- Kafka的幂等只能保证单个生产者会话(session)中单分区的幂等。幂等性不能跨多个分区运作,而事务可以弥补这个缺陷。
事务
- 事务可以保证对多个分区写入操作的原子性。操作的原子性是指多个操作要么全部成功,要么全部失败,不存在部分成功、部分失败的可能。
- 用户在客户端为producer设置一个transactional.id,此时当往broker发送消息时就会开启事务。
- 为了保证新的生产者启动后具有相同transactional.id的旧生产者能够立即失效,每个生产者通过transactionalId获取PID的同时,还会获取一个单调递增的producer epoch。如果使用同一个transactionalId开启两个生产者,那么前一个开启的生产者会报错。
- 在Kafka中设置参数isolation.level为read_committed。