Kafka幂等性和事务
消息交付可靠性保障
所谓的消息交付可靠性保障,是指Kafka对Producer和Consumer要处理的消息提供什么样的承诺,常见三种如下:
最多一次(at most once):消息可能会丢失,但绝不会被重复发送。
只需要设置Producer禁止重复即可。消息要么写入成功,要么写入失败,不会进行重试。
至少一次(at least once):消息不会丢失,但有可能被重复发送。
如果消息成功提交,但是Broker的应答没有成功发送会Producer端,那么Producer就无法确定消息是否真的提交成功,因此会进行重试。
精确一次(exactly once):消息不会丢失,也不会被重复发送。
Kafka通过幂等性(Idempotence)和事务(Transaction)来保障精确一次。
幂等性(Idempotence)
在Kafka中,Producer默认不是幂等性的,但我们可以创建幂等性的Producer。它是0.11版本中引入的。设置方式:
props.put( "enable.idempotence", true );
但是它只能保证单分区上的幂等性,即一个幂等性Producer能够保证某个主题的一个分区上不出现重复消息,它无法保证多个分区的幂等性。其次,它只能实现单会话上的幂等性,不会实现跨会话的幂等性。
事务(Transcation)
设置事务型Producer有2个要求:
- 和幂等性Producer一样,开启enable.idempotence = true。
- 设置Producer端参数transactional.id。最好为其设置一个有意义的名字
使用initTransaction、beginTransaction、commitTransaction和abortTransaction,进行事务初始化、开启事务、事务提交及事务终止。
隔离级别设置
isolation.level参数
- read_uncommitted:这是默认值,表示Consumer能够读取到Kafka写入的任何消息,不论事务型Producer提交事务还是终止事务,其写入的消息都可以读取。很显然,如果你用了事务型Producer,那么对应的Consumer就不要使用这个值。
- read_committed:表明Consumer只会读取事务型Producer成功提交事务写入的消息。

浙公网安备 33010602011771号