我们有以下问题:
我们想监听某个 Kafka 主题并构建它的“历史” - 因此对于指定的密钥提取一些数据,将其添加到该密钥的现有列表中(或者如果它不存在则创建一个新列表)并将其放入另一个主题,它只有一个分区并且高度压缩。另一个应用程序可以只收听该主题并更新其历史列表。
我在想它如何适合 Kafka 流库。我们当然可以使用聚合:
msgReceived.map((key, word) -> new KeyValue<>(key, word))
.groupBy((k,v) -> k, stringSerde, stringSerde)
.aggregate(String::new,
(k, v, stockTransactionCollector) -> stockTransactionCollector + "|" + v,
stringSerde, "summaries2")
.to(stringSerde, stringSerde, "transaction-summary50");
它创建了一个由 Kafka 支持的本地存储并将其用作历史表。
我担心的是,如果我们决定扩展这样的应用程序,每个正在运行的实例都会创建一个新的支持主题${applicationId}-${storeName}-changelog
(我假设每个应用程序都有不同的applicationId
)。每个实例开始使用输入主题,获取一组不同的键并构建不同的状态子集。如果 Kafka 决定重新平衡,一些实例将开始错过本地存储中的一些历史状态,因为它们会获得一组全新的分区来消费。
问题是,如果我只是为每个正在运行的实例设置相同的 applicationId,它最终是否应该重放来自每个正在运行的实例具有相同本地状态的同一个 kafka 主题的所有数据?