簡體   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