我最近一直在研究Kafka Streams API,而且我在理解KTables方面遇到了一些麻烦。我想我理解了一般概念,但我正在努力解决一些细节问题。
在我的示例应用程序中,我获取了一堆价格,然后使用Kafka Streaming API将每个产品的平均价格生成为压缩 Kafka主题(主题-A )。我有第二项服务,我想对这些平均价格更新做出反应。因此,在第二项服务中,我在主题-A 上创建了KTable
,我可以成功查询其商店。
我的目标是实现第二个服务流程&实时对这些平均价格做出反应,同时也可以根据需要获得每种产品的最新价值。我相信我可以使用KTable和Store来做到这一点。
最初,我相信:
然而,好像KTables(或可能是?)由compacted change-log支持。
这是否意味着在初始化时,KTable只需要消耗每个密钥的最新记录?
如果我运行第二个服务的多个实例,KTables是否共享更改日志?我想如果实例数量按比例放大/缩小,实例需要更新其本地表示来自更多/更少分区的数据。
使用GlobalKTable会为我提供每个实例中可用的所有K / V对吗?
答案 0 :(得分:4)
- 这是否意味着在初始化时,
醇>KTable
只需要使用每个密钥的最新记录?
是的。如果基础主题中的数据使得每个值表示该键的完整最新值,则可以使用cleanup.policy=compact
配置主题,并且Kafka Streams只需要读取最新值以恢复KTable
(这是RocksDB商店)。在数据建模方面,这是您想要/有意义的唯一一种数据/主题,可用作KTable
的输入。
- 如果我运行第二个服务的多个实例,
醇>KTables
是否共享更改日志?
是的,他们从相同的更改日志主题中读取,但他们根据您在Kafka Streams配置中提供的state.dir
参数生成自己的RocksDB商店。
- 使用
醇>GlobalKTable
会给我每个实例中可用的所有K / V对吗?
是的,但GlobalKTables
对您使用它们的处理方式略有限制,而不是常规KTables
。我相信新的1.0.0版本增加了GlobalKTables
的功能,但它们仍有一些限制。