KTables如何获得初始值?

时间:2017-12-12 09:20:53

标签: java apache-kafka apache-kafka-streams

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

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

我的目标是实现第二个服务流程&实时对这些平均价格做出反应,同时也可以根据需要获得每种产品的最新价值。我相信我可以使用KTable和Store来做到这一点。

最初,我相信:

  • KTable由本地商店(RocksDB实例)支持
  • 初始化KTable时,它会消耗整个 Topic-A 来构建其KTable

然而,好像KTables(或可能是?)由compacted change-log支持。

  1. 这是否意味着在初始化时,KTable只需要消耗每个密钥的最新记录?

  2. 如果我运行第二个服务的多个实例,KTables是否共享更改日志?我想如果实例数量按比例放大/缩小,实例需要更新其本地表示来自更多/更少分区的数据。

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

1 个答案:

答案 0 :(得分:4)

  
      
  1. 这是否意味着在初始化时,KTable只需要使用每个密钥的最新记录?
  2.   

是的。如果基础主题中的数据使得每个值表示该键的完整最新值,则可以使用cleanup.policy=compact配置主题,并且Kafka Streams只需要读取最新值以恢复KTable (这是RocksDB商店)。在数据建模方面,这是您想要/有意义的唯一一种数据/主题,可用作KTable的输入。

  
      
  1. 如果我运行第二个服务的多个实例,KTables是否共享更改日志?
  2.   

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

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

是的,但GlobalKTables对您使用它们的处理方式略有限制,而不是常规KTables。我相信新的1.0.0版本增加了GlobalKTables的功能,但它们仍有一些限制。