有一系列关于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请求