【问题标题】:Kafka: topic compaction notification?Kafka:主题压缩通知?
【发布时间】:2018-04-06 02:47:27
【问题描述】:

我得到了以下我正在尝试改进的架构。

我收到一个数据库更改流,最终形成一个压缩主题。流基本上是键/值对,键空间很大(~4 GB)。

主题由一个 kafka 流进程消费,该进程将数据存储在 RockDB 中(每个消费者/分片分开)。处理器做了两个不同的事情:

  1. 将数据加入另一个流。
  2. 检查来自主题的消息是新密钥还是现有密钥的更新。如果是更新,它会将旧的键/值和新的键/值对发送到不同的主题(更新很少)。

这个结构有几个问题:

  1. 流处理器的两种不同功能属于不同的团队,不应属于同一代码库。它们被放在一起以节省内存。如果我们将其分开,我们将不得不复制 RockDB。
  2. 我更喜欢使用普通的 KTable 连接,而不是当前代码中的手工连接。
  3. 如果数据已经保存在主题中,RockDB 似乎有点矫枉过正。我们目前遇到了一些性能问题,我认为如果我们将所有内容都保存在内存中会更快。

问题 1: 有没有办法挂钩压缩主题的压缩过程?对于实际压缩的每个键(包括旧值和新值),我想要一个通知(到不同的主题)。 如果这是可能的,我可以轻松地将代码库分开并简化连接。

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

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

    你的整体设计很有意义。

    关于您的连接语义:我想您需要坚持使用处理器 API,因为常规 KTable 无法提供您想要的。也不能挂钩到压缩过程中。

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

    默认使用 RocksDB,以允许状态大于可用的主内存。使用 RocksDB 溢出到磁盘以提高可靠性 - 但是,它还有一个优势,即如果实例在同一台机器上重新联机,则可以更快地重新创建存储,因为不需要重新读取整个变更日志主题。

    如果您想将应用一分为二,您自己决定要提供多少资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2018-09-14
      • 1970-01-01
      • 2019-04-22
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多