簡體   English   中英

合並多個相同的Kafka Streams主題

[英]Merging multiple identical Kafka Streams topics

我有2個Kafka主題,可從不同來源流式傳輸完全相同的內容,因此,如果其中一個來源發生故障,我將具有很高的可用性。 我正在嘗試使用Kafka Streams 0.10.1.0將2個主題合並為1個輸出主題,這樣我就不會錯過任何關於失敗的消息,並且當所有來源都打開時就不會重復。

當使用leftJoin方法時,一個主題可以毫無問題地關閉(第二個主題),但是當主主題關閉時,沒有任何內容發送到輸出主題。 根據Kafka Streams開發人員指南 ,這似乎是因為,

KStream-KStream leftJoin始終由來自主流的記錄驅動

因此,如果沒有來自主流的記錄,則即使存在,它也不會使用來自輔助流的記錄。 一旦主流返回在線狀態,輸出將正常恢復。

我還嘗試了使用outerJoin (添加重復記錄),然后轉換為KTable和groupByKey來消除重復項,

KStream mergedStream = stream1.outerJoin(stream2, 
    (streamVal1, streamVal2) -> (streamVal1 == null) ? streamVal2 : streamVal1,
    JoinWindows.of(2000L))

mergedStream.groupByKey()
            .reduce((value1, value2) -> value1, TimeWindows.of(2000L), stateStore))
            .toStream((key,value) -> value)
            .to(outputStream)

但我仍然偶爾會得到重復。 我還使用commit.interval.ms=200來使KTable足夠頻繁地發送到輸出流。

進行此合並以從多個相同輸入主題中獲取一次准確輸出的最佳方法是什么?

使用任何一種連接都無法解決您的問題,因為您總是會丟失結果(如果某些流停頓了,則是內部聯接)或帶有null “重復項”(如果兩個流均是左聯接或外聯接)線上)。 有關Kafka Streams中連接語義的詳細信息,請參見https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Join+Semantics

因此,我建議使用Processor API,您可以使用KStream process()transform()transformValues()與DSL進行KStream 有關更多詳細信息,請參見如何使用處理器使用Kafka Stream DSL過濾鍵和值

您還可以將自定義存儲添加到處理器( 如何將自定義StateStore添加到Kafka Streams DSL處理器? ),以使重復過濾容錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM