卡夫卡:主题压缩通知?

时间:2018-04-04 19:55:19

标签: apache-kafka apache-kafka-streams

我获得了以下我想要改进的架构。

我收到了一系列数据库更改,最终出现在一个压缩的主题中。流基本上是键/值对,键空间很大(约4 GB)。

该主题由一个kafka流进程使用,该进程将数据存储在RockDB中(对于每个使用者/分片而言是分开的)。处理器做了两件事:

  1. 将数据加入另一个流中。
  2. 检查来自主题的消息是新密钥还是对现有密钥的更新。如果是更新,则会将旧密钥/值和新密钥/值对发送到其他主题(更新很少)。
  3. 该构造有几个问题:

    1. 流处理器的两个不同功能属于不同的团队,不应该是同一代码库的一部分。它们被放在一起以节省内存。如果我们将它分开,我们将不得不复制RockDB&#39。s。
    2. 我更倾向于使用普通的KTable连接,而不是代码中当前的手工连接。
    3. 如果数据已经存在于主题中,那么RockDB似乎有些过分。我们目前遇到了一些性能问题,我认为如果我们将所有内容保存在内存中会更快。
    4. 问题1: 有没有办法挂钩压缩主题的压缩过程?我想为每个实际压缩的密钥(包括旧值和新值)发出通知(针对不同的主题)。 如果这在某种程度上是可能的,我可以轻松地拆分代码库并简化连接。

      问题2: 关于如何更优雅地解决这个问题的任何其他想法?

1 个答案:

答案 0 :(得分:1)

你的整体设计很有意义。

关于你的连接语义:我想你需要坚持使用Processor API,因为常规KTable无法满足你的需要。它也不可能进入压实过程。

但是,Kafka Streams还支持内存状态存储:https://kafka.apache.org/documentation/streams/developer-guide/processor-api.html#state-stores

默认情况下使用RocksDB,以允许状态大于可用的主内存。使用RocksDB将磁盘扩散到可靠性 - 然而,它还具有以下优点:如果实例在同一台计算机上重新联机,则可以更快地重新创建存储,因为它不需要重新读取整个更改日志主题

如果您想将应用分成两部分,您自己决定要提供多少资源。