【发布时间】:2018-06-22 17:51:14
【问题描述】:
这是Kafka Streams - How to scale Kafka store generated changelog topics的后续问题
让我们假设流使用者需要在存储数据之前进行一些转换(通过 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-> 事件并生成多个包含所有内容的 changelog 中间主题(这不是最佳存储方式)。
- 如果所有消费者具有相同的 applicationId,但在不同的组中,因此独立加载所有 k->v 事件,他们将在共享变更日志流中贡献相同的计算 k->v 事件(基于应用程序 ID)。这看起来并不理想,因为我们会多次计算和生成相同的数据。
- 如果所有消费者具有相同的 applicationId,并且在同一个组中只消费 k->v 事件的一部分(根据分区),他们将贡献一部分计算的 k->v 在共享变更日志流。但我不清楚每个物化的 RocksDB 是否会有完整的数据集,还是只有流经其消费者管道的切片?
【问题讨论】:
标签: apache-kafka apache-kafka-streams