繁体   English   中英

Kafka Streams-主题中的消息数量不一致

[英]Kafka Streams - Inconsistency in number of messages in a topic

假设我们有一个包含1000条消息的Kafka主题。 我们从中创建一个流(在下面称为st),然后执行以下操作:

int count = 0;

st.groupByKey().count().foreach((key, value) -> {

       count += value)
       System.out.println(count)
});

当处理“结束”时,它返回一个稍微大于1000的数字。什么可能导致这种奇怪的行为?

如果您的某些消息具有相同的密钥,则您的代码将重复计算它们。 请注意,传递给KTable的foreach()方法的函数不是每行执行一次,而是每行更新一次(由于缓存而可能并非每次更新)都执行一次。 请参阅: https : //kafka.apache.org/11/javadoc/org/apache/kafka/streams/kstream/KTable.html#foreach-org.apache.kafka.streams.kstream.ForeachAction-

对此KTable的每个更新记录执行操作。 请注意,这是一个返回void的终端操作。

请注意,foreach()不会应用于内部状态存储,仅会为每个新的KTable更新记录调用。

假设您有3条带有键“ A”的消息。 由count()聚合创建的KTable将被更新3次,并且您的函数(lambda表达式)将使用以下参数被调用3次:(“ A”,1),(“ A”,2),(“ A “,3),导致计数增加1 + 2 + 3 = 6,而不是增加3。

KStream和KTable表示“动态数据”,它们的方法通常在数据流上运行。 如果要对数据的当前快照进行操作,请考虑使用交互式查询。 可能由于KTable.foreach方法最初可能会造成混淆,因此已弃用以下注释:

已过时。 使用交互式查询API(例如,KafkaStreams.store(String,QueryableStoreType),后跟ReadOnlyKeyValueStore.all())来迭代KTable的键。 或者使用toStream()转换为KStream,然后对结果使用foreach(action)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM