有一系列关于Kafka交易的优秀文章,一次交付 作者其中一个对消费者说:
因此,在消费者方面,您有两种选择来读取事务性消息,通过“isolation.level”消费者配置表示:
read_committed:除了读取不属于事务的消息之外,还可以读取之后的消息 交易已提交。
read_uncommitted:以偏移顺序读取所有消息,而不等待提交事务。此选项类似于 Kafka消费者的当前语义。
也就是说,如果只想从主题中读取提交写入,则普通的消费者应用程序必须指定read_committed
。
但是关于Kafka Streams:
您只需要使Streams应用程序使用一次即可 语义,就是设置这个配置“processing.guarantee = exactly_once”。 这导致所有处理恰好发生一次;这个 包括处理和处理所有物化 由写回Kafka的处理作业创建的状态, 一次。
关于KStream中的读取没有明确说明。配置exactly_once
时,KStream是否只读取已提交的消息?
是的KStream只会读取已提交的消息,文档中没有明确说明,但在StreamsConfig JavaDoc中您会找到以下信息:
如果"processing.guarantee"设置为" exactly_once ",Kafka Streams不允许用户覆盖以下属性(括号中显示的Streams设置): "isolation.level"(read_committed) - 消费者将始终只读取已提交的数据 "enable.idempotence" (true) - 生产者将始终启用幂等性 "max.in.flight.requests.per.connection" (5) - 生产者每个连接总是有一个in-flight请求