KTable和本地商店之间的区别

时间:2018-09-24 22:15:57

标签: apache-kafka apache-kafka-streams

这些实体之间有什么区别?

我认为KTable-具有compaction删除策略的简单kafka主题。另外,如果为KTable启用了日志记录,那么还将有changelog,然后删除策略为compaction,delete

本地存储-基于RockDB的内存中键值缓存。但是本地商店也有一个变更日志。

在两种情况下,我们都将在特定时间段(?)中获得密钥的最后一个值。本地存储用于聚合步骤,联接等。但是,紧随其后的还有创建具有压缩策略的新主题。

例如:

KStream<K, V> source = builder.stream(topic1);
KTable<K, V> table = builder.table(topic2); // what will happen here if i read data from topic with deletion policy delete and compaction? Will additional topic be created for store data or just a local store (cache) be used for it?

// or
KTable<K, V> table2 = builder.table(..., Materialized.as("key-value-store-name")) // what will happen here? As i think, i just specified a concrete name for local store and now i can query it as a regular key-value store

source.groupByKey().aggregate(initialValue, aggregationLogic, Materialized.as(...)) // Will new aggregation topic be created here with compaction deletion policy? Or only local store will be used?

我还可以使用构建器builder.addStateStore(...)创建一个状态存储,在其中可以启用/禁用日志记录(changelog)和缓存(???)。

我已经读过这篇文章:https://docs.confluent.io/current/streams/developer-guide/memory-mgmt.html,但是对于我来说,一些细节仍然不清楚。尤其是当我们可以禁用StreamCache(但不能禁用RockDB缓存)并为关系数据库获得CDC系统的完整副本的情况下

1 个答案:

答案 0 :(得分:6)

KTable是表的逻辑抽象,该表随时间更新。此外,您可以将其视为不是物化表,而是由表的所有更新记录组成的变更日志流。比较https://docs.confluent.io/current/streams/concepts.html#duality-of-streams-and-tables。因此,如果您愿意,从概念上讲KTable是某种混合形式,但是,将其视为随时间更新的表会更容易。

内部,使用RocksDB和Kafka中的主题来实现KTable。 RocksDB,存储表的当前数据(请注意,RocksDB不是内存存储,并且可以写入磁盘)。同时,对KTable(即RocksDB)的每次更新都被写入相应的Kafka主题。 Kafka主题用于容错原因(请注意,RocksDB本身被认为是临时的,通过RocksDB写入磁盘不提供容错功能,但使用了changelog主题),并且配置了日志压缩功能以确保通过阅读该主题,可以恢复RocksDB的最新状态。

如果您有一个由窗口聚合创建的KTable,则将compact,delete配置为Kafka主题,以使过期的旧数据(即旧的窗口)过期以避免该表(即RocksDB) )变得无限。

除了RocksDB,您还可以为未写入磁盘的KTable使用内存中的存储。该存储区还将具有一个changelog主题,该跟踪记录出于容错原因而跟踪对该存储区的所有更新。

如果您通过builder.addStateStore()手动添加存储,则还可以添加RocksDB或内存存储。对于这种情况,您可以启用类似于KTable的容错更改日志记录(注意,在创建KTable时,内部使用的是完全相同的API,即KTable是一个更高级别的抽象隐藏了一些内部细节。

对于缓存:这是在Kafka Streams内以及商店(RocksDB或内存中)的顶部实现的,您可以为手动添加的“普通”商店(对于KTables)启用/禁用。比较https://docs.confluent.io/current/streams/developer-guide/memory-mgmt.html因此,缓存独立于RocksDB缓存。