簡體   English   中英

Kafka Streams-共享的更改日志主題

[英]Kafka Streams - shared changelog topic

這是一個后續問題: Kafka Streams-如何縮放Kafka存儲生成的changelog主題

假設我們假設流使用者在存儲數據之前需要進行一些轉換(通過v-> k而不是k-> v進行索引)。

最后,目標是每個使用者都需要將完整的轉換記錄(v-> k)集合存儲在rockDB中。 我知道上游的另一個處理器可以根據k-> v來產生v-> k,最終使用者可以簡單地從globaltable中實現新主題。 但是,如果流水線全部由最終用戶完成,會發生什么呢?

KTable<Key, Value> table = builder.table(topic);
table.groupBy((k, v) -> KeyValue.pair(v, k)).reduce((newValue, aggValue) -> newValue,
                                                    (newValue, aggValue) -> null,
                                                    Materialized.as(STORE_NAME));

在這種情況下,哪種選擇是最佳實踐或最佳選擇(如果我的假設不成立,請讓我正確)?

  1. 如果所有使用者都具有不同的applicationId,而與groupId無關,則每個使用者將消耗所有k->事件並生成具有所有內容的多個changelog中間主題(這不是最佳的存儲方式)。
  2. 如果所有使用者都具有相同的applicationId,但位於不同的組中,從而獨立加載所有k-> v事件,則它們將在共享的更改日志流(基於applicationId)中共同貢獻相同的計算的k-> v事件。 這看起來並不理想,因為我們會多次計算和產生相同的數據。
  3. 如果所有使用者都具有相同的applicationId,並且在同一組中僅消耗k-> v個事件的一部分(根據分區),則它們將在共享變更日志流中貢獻一部分已計算的k-> v 。 但是我不清楚每個實現的rocksDB是否將擁有完整的數據集,或者僅具有流經其消費者管道的切片?

對於Kafka Streams, applicationId == groupId 因此,(2)是不可能的。

對於(3),將對該狀態進行分片/分區,並且每個實例僅具有該狀態的一部分。

如果要獲取狀態的完整副本,則需要使用GlobalKTables而不是KTables

暫無
暫無

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

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