【问题标题】:Kafka Streams - shared changelog topicKafka Streams - 共享变更日志主题
【发布时间】: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));

对于这种情况,哪些选项是最佳实践或最佳(如果我的假设不成立,请纠正我)?

  1. 如果所有消费者都有不同的 applicationId,无论 groupId 是什么,他们都会消费所有 k-> 事件并生成多个包含所有内容的 changelog 中间主题(这不是最佳存储方式)。
  2. 如果所有消费者具有相同的 applicationId,但在不同的组中,因此独立加载所有 k->v 事件,他们将在共享变更日志流中贡献相同的计算 k->v 事件(基于应用程序 ID)。这看起来并不理想,因为我们会多次计算和生成相同的数据。
  3. 如果所有消费者具有相同的 applicationId,并且在同一个组中只消费 k->v 事件的一部分(根据分区),他们将贡献一部分计算的 k->v 在共享变更日志流。但我不清楚每个物化的 RocksDB 是否会有完整的数据集,还是只有流经其消费者管道的切片?

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

    对于 Kafka Streams,applicationId == groupId。因此 (2) 是不可能的。

    对于 (3),该状态是分片/分区的,每个实例只有部分状态。

    如果要获取状态的完整副本,需要使用GlobalKTables 而不是KTables

    【讨论】:

    • 哦。我不太明白 applId 正在取代 kafka 流的 groupId。感谢您的澄清。因此,如果独立的 appId (#1) 复制了中间主题,并且如果同一 appid 的多个消费者对同一个变更日志中间主题做出贡献,则在具体化变更日志主题时只会获得数据碎片,那么我看到的唯一选择就是拥有一个上游独立处理器,它使用 k->v 生成单个 v->k 主题,然后每个消费者可以使用 GlobalTable 完全使用该主题。
    • 但是当使用 GlobalKTable 时,有没有办法在实现到 RocksDB 存储之前在客户端应用一些基本的无状态转换(例如过滤)。否则,我们必须存储所有 GlobalKTable,或者我们需要一个预处理流应用程序来过滤 globalTable,将代理端的数据加倍(部分)。
    • 对于 GlobalKTable 这在 atm 是不可能的——这是一个缺失的功能。如果您改用#addGlobalStore(),则可以在将数据放入您传入的Processor 中的存储之前实现过滤器逻辑。不确定您是否可以使用全局商店而不是 GlobalKTable
    • 很高兴知道。您是否计划在我们可以跟踪的未来版本中提出功能请求?我不确定我是否理解您描述的在将数据放入处理器之前如何实现过滤器逻辑的流程。你有例子可以参考吗?
    • 我已经实现了一个addGlobalStore,它带有一个自定义处理器,负责将输入流中的 K,V 记录转换为 V,K 记录。它工作正常,我的store.all() 确实打印了正确的持久 V、K 记录。但是,如果我清理本地存储并重新启动流应用程序,则会重新加载全局表,但不会通过自定义处理器;相反,它调用GlobalStateManagerImp#restoreState,它只是将输入主题K、V 记录存储到rocksDB 中(因此绕过了我的自定义处理器的映射功能)。我相信这一定不是预期的结果?
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多