KTables如何获得它们的初始值?

How do KTables get their initial values?

我最近一直在研究 Kafka Streams API,但我在理解 KTables 方面遇到了一些困难。我想我理解了一般概念,但我正在努力解决一些细节问题。

在我的示例应用程序中,我获取了一堆价格,然后使用 Kafka Streaming API 将每个产品的平均价格生成到 compacted Kafka 主题( 主题-A)。我有第二个服务,我想对这些平均价格更新做出反应。所以在第二个服务中,我在 Topic-A 上创建了一个 KTable,我可以成功查询它的商店。

我的目标是让第二个服务流程实时对这些平均价格做出反应,同时还能按需访问每个产品的最新价值。我相信我可以使用 KTable 和 Store 来做到这一点。

最初,我相信:

但是,KTables 似乎(或可以?)得到 compacted change-log 的支持。

  1. 这是否意味着KTable在初始化时只需要为每个key消费最新的记录?

  2. 如果我 运行 我的第二个服务的多个实例,KTables 是否共享一个更改日志? 我想如果实例的数量被缩放up/down,实例需要更新其本地状态以说明来自 more/less 个分区的数据。

  3. 使用 GlobalKTable 会给我每个实例中可用的所有 K/V 对吗?

  1. Does this mean that upon initialization, the KTable only needs to consume the latest record for each key?

是的。如果底层主题中的数据是这样的,每个值代表该键的完整最新值,那么主题可以配置为 cleanup.policy=compact 并且 Kafka Streams 只需要读取最新值来恢复 KTable (这是一个 RocksDB 存储)。在数据建模方面,这是您 want/makes 认为可以用作 KTable.

的唯一一种 data/topic 类型
  1. If I run multiple instances of my second service do the KTables share a change log?

是的,他们从相同的变更日志主题中读取,但他们根据您在 Kafka Streams 配置中提供的 state.dir 参数生成自己的 RocksDB 存储。

  1. Would using a GlobalKTable give me all the K/V pairs available in each instance?

是的,但是 GlobalKTables 与常规 KTables 相比,您可以使用它们进行的操作略有限制。我相信新的 1.0.0 版本已经为 GlobalKTables 添加了功能,但它们仍然有一些限制。