簡體   English   中英

在 Streams 應用的所有實例中使用某個主題的所有消息

[英]Consume all messages of a topic in all instances of a Streams app

在 Kafka Streams 應用程序中,實例僅獲取已分配給該實例的分區的輸入主題的消息。 作為基於(對於所有實例相同的) application.idgroup.id ,這意味着每個實例只能看到主題的一部分。

當然,這一切都非常有意義,我們將其與高吞吐量數據主題一起使用,但我們還希望通過向輸入主題添加主題范圍的“控制消息”來控制流應用程序。 但是由於所有實例都需要獲取這些消息,我們要么必須發送

  1. 每個分區一個控制消息(使發送者有必要了解分區方案,這是我們希望避免的)
  2. 每個鍵一個控制消息(因此每個活動分區都將獲得至少一個控制消息)

因為這對發送者來說很麻煩,所以我們正在考慮為流應用程序消費的控制消息創建一個新主題,除了數據主題。 但是我們怎樣才能讓每個分區都接收到來自控制消息主題的所有消息呢?

根據https://stackoverflow.com/a/55236780/709537 ,無法為 Kafka Streams 設置組 ID。

除了使用 Kafka Streams 之外,一種方法是創建和使用KafkaConsumer ,這將允許我們根據需要設置組 ID。 然而,這聽起來很復雜和骯臟,以至於想知道我們是否缺少更直接的方法。

有任何想法嗎?

您可以使用從所有分區獲取數據的全局存儲。

文檔中,

將全局 StateStore 添加到拓撲。 StateStore 從提供的輸入主題的所有分區中獲取其數據。 每個 Kafka Streams 實例都會有這個 StateStore 的一個實例。

語法如下:

public StreamsBuilder addGlobalStore(StoreBuilder storeBuilder,
                                     String topic,
                                     Consumed consumed,
                                     ProcessorSupplier stateUpdateSupplier)

最后一個參數是ProcessorSupplier ,它有一個get() ,它返回一個Processor ,它將為每條新消息執行。 Processor包含process()方法,每次有新消息發送到該主題時都會執行該方法。

全局存儲是每個 stream 實例,因此您可以獲得每個 stream 實例中的所有主題數據。

process(K key, V value)中,你可以編寫你的處理邏輯。

全局存儲可以在內存中或持久存儲,並且可以由變更日志主題支持,因此即使流實例本地數據(狀態)被刪除,也可以使用變更日志主題構建存儲。

暫無
暫無

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

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