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成功提交事务写入的消息。

 

posted @ 2022-01-29 19:16  JavaIceman  阅读(293)  评论(0)    收藏  举报