Kafka Streams - 共享变更日志主题
Kafka Streams - shared changelog topic
这是以下问题的后续问题:
让我们假设流消费者需要在存储数据之前进行一些转换(通过 v->k 而非 k->v 进行索引)。
最后,目标是每个消费者需要将完整的转换记录集(v->k)存储在 rocksDB 中。
我知道上游的另一个处理器可以负责根据 k->v 生成 v->k,最终消费者可以简单地从全局表中具体化新主题。
但是,如果管道全部在最终消费者处完成,会发生什么情况?
KTable<Key, Value> table = builder.table(topic);
table.groupBy((k, v) -> KeyValue.pair(v, k)).reduce((newValue, aggValue) -> newValue,
(newValue, aggValue) -> null,
Materialized.as(STORE_NAME));
对于这种情况,这些选项中的哪一个是最佳实践或最优化(如果我的假设不正确,请支持我)?
- 如果所有消费者都有不同的 applicationId,无论 groupId 是什么,他们都将消费所有 k-> 事件并生成多个包含所有内容的更新日志中间主题(这不是最佳存储方式)。
- 如果所有消费者都有相同的 applicationId,但在不同的组中,从而独立加载所有 k->v 事件,他们将在共享的变更日志流中贡献相同的计算 k->v 事件(基于在 applicationId 上)。这看起来不是最优的,因为我们会多次计算和生成相同的数据。
- 如果所有消费者都有相同的applicationId,并且在同一个组中只消费一部分k->v事件(根据分区),他们将贡献一部分计算的k->v在共享的变更日志流中。但我不清楚每个物化 rocksDB 是否会有完整的数据集或只有流经其消费者管道的切片?
对于卡夫卡流,applicationId == groupId
。因此 (2) 是不可能的。
对于(3),那个状态是sharded/partitioned并且每个实例只有状态的一部分。
如果要获取状态的完整副本,需要使用GlobalKTables
而不是KTables
。
这是以下问题的后续问题:
让我们假设流消费者需要在存储数据之前进行一些转换(通过 v->k 而非 k->v 进行索引)。
最后,目标是每个消费者需要将完整的转换记录集(v->k)存储在 rocksDB 中。 我知道上游的另一个处理器可以负责根据 k->v 生成 v->k,最终消费者可以简单地从全局表中具体化新主题。 但是,如果管道全部在最终消费者处完成,会发生什么情况?
KTable<Key, Value> table = builder.table(topic);
table.groupBy((k, v) -> KeyValue.pair(v, k)).reduce((newValue, aggValue) -> newValue,
(newValue, aggValue) -> null,
Materialized.as(STORE_NAME));
对于这种情况,这些选项中的哪一个是最佳实践或最优化(如果我的假设不正确,请支持我)?
- 如果所有消费者都有不同的 applicationId,无论 groupId 是什么,他们都将消费所有 k-> 事件并生成多个包含所有内容的更新日志中间主题(这不是最佳存储方式)。
- 如果所有消费者都有相同的 applicationId,但在不同的组中,从而独立加载所有 k->v 事件,他们将在共享的变更日志流中贡献相同的计算 k->v 事件(基于在 applicationId 上)。这看起来不是最优的,因为我们会多次计算和生成相同的数据。
- 如果所有消费者都有相同的applicationId,并且在同一个组中只消费一部分k->v事件(根据分区),他们将贡献一部分计算的k->v在共享的变更日志流中。但我不清楚每个物化 rocksDB 是否会有完整的数据集或只有流经其消费者管道的切片?
对于卡夫卡流,applicationId == groupId
。因此 (2) 是不可能的。
对于(3),那个状态是sharded/partitioned并且每个实例只有状态的一部分。
如果要获取状态的完整副本,需要使用GlobalKTables
而不是KTables
。