关于Kafka交易以及一次交货的文章非常多。
In one of them作者谈到消费者:
因此,在使用者方面,您有两个用于读取事务性消息的选项,它们通过“ isolation.level”使用者配置表示:
read_committed:除了读取不属于事务的消息外,还可以读取 交易已提交。
read_uncommitted:按偏移顺序读取所有消息,而无需等待事务提交。此选项类似于 Kafka使用者的当前语义。
也就是说,如果普通消费者应用程序仅希望从该主题读取提交写入,则必须指定read_committed
。
但是关于Kafka Streams:
使Streams应用程序只使用一次所需的全部 语义,就是将此配置设置为“ processing.guarantee = exactly_once”。 这将导致所有处理仅发生一次。这个 包括既进行处理又进行所有物化 由写回Kafka的处理作业创建的状态, 一次。
关于KStream中的读取,没有明确说明。配置exactly_once
后,KStream是否仅读取已提交的消息?
答案 0 :(得分:2)
是的,KStream仅读取已提交的消息,文档中没有明确说明,但是在StreamsConfig JavaDoc中您会找到以下信息:
如果将“ processing.guarantee”设置为“ exactly_once”,则Kafka Streams不允许用户覆盖以下属性(括号中显示的Streams设置): “ isolation.level”(read_committed)-使用者将始终仅读取已提交的数据 “ enable.idempotence”(true)-生产者将始终启用幂等性 “ max.in.flight.requests.per.connection”(5)-生产者每次连接总是有一个进行中的请求