Apache kafka Apache Kafka:保留时间长,而不是快速读取最后一个值

Apache kafka Apache Kafka:保留时间长,而不是快速读取最后一个值,apache-kafka,Apache Kafka,亲爱的阿帕奇·卡夫卡的朋友们: 我有一个用例,我正在寻找一个优雅的解决方案: 数据以卡夫卡主题的相对较高比率发布。有两个相互竞争的要求 所有记录应保存7天(由min.Compression.lag配置) 应用程序应在初始化阶段读取主题中的“最后状态” 启用日志压缩是为了使“最后状态”在主题中可用。 现在问题来了。如果应用程序希望从主题中初始化自身,它必须读取大量记录才能获得所有键的最后状态(必须处理整个主题内容)。但这在记录数量上是不可能的 创意 流式处理将主题的数据流到相应的短期主题中,该

亲爱的阿帕奇·卡夫卡的朋友们:

我有一个用例,我正在寻找一个优雅的解决方案:

数据以卡夫卡主题的相对较高比率发布。有两个相互竞争的要求

  • 所有记录应保存7天(由min.Compression.lag配置)
  • 应用程序应在初始化阶段读取主题中的“最后状态”
启用日志压缩是为了使“最后状态”在主题中可用。 现在问题来了。如果应用程序希望从主题中初始化自身,它必须读取大量记录才能获得所有键的最后状态(必须处理整个主题内容)。但这在记录数量上是不可能的

创意

流式处理将主题的数据流到相应的短期主题中,该主题的最小压缩滞后时间(1小时)要短得多。应用程序根据本主题进行自我初始化

风险

流式处理是错误的潜在来源。如果暂时失败,应用程序将不再接收最新状态

我的问题

是否有其他可能的解决方案来满足这两个要求。我是否错过了有助于处理这些竞争性需求的Kafa概念


欢迎任何贡献。谢谢大家。

如果您不能严格保证每个密钥的更新频率,您就不能按照您的建议执行任何其他操作

为了避免下游应用程序无法获得新更新的风险(因为数据复制作业暂停),我建议只从短期主题引导应用程序,然后让它从原始主题消费。为了不错过任何更新,您可以按如下方式同步切换:

  • 在应用程序启动时,从原始主题获取复制作业的提交偏移量
  • 获取短期主题的当前结束偏移量(因为复制作业将继续写入数据,所以您只需要一个固定的停止点)
  • 从头到尾使用短期主题
  • 使用捕获的提交偏移量(从步骤1开始)作为起点,从原始主题恢复消费

  • 这样,您可能会阅读一些消息两次,但不会丢失任何更新。

    对我来说,您提到的两个要求以及对新消费者的要求并不相互竞争。事实上,我不认为你有任何理由在你的主题中保留一个过期键的消息7天,因为

    • 新的消费者只对密钥的最新消息感兴趣
    • 已经存在的消费者将在1小时内处理该消息(根据您的评论)
    因此,我的理解是,您的要求“所有记录应保留7天”可以替换为“每个消费者应有足够的时间使用该消息&每个密钥的最新消息应保留7天”

    如果我错了,请纠正我,并解释哪个消费者确实需要“7天的所有记录”

    如果是这种情况,您可以执行以下操作:

  • 为此主题启用日志压缩和基于时间的保留至7天
  • 微调压缩频率,使其非常急切,这意味着为密钥保留尽可能少的过期消息
  • 将min.Compression.lag设置为1小时,以便所有消费者都有机会跟上

  • 这样,新消费者将(几乎)只读取每个键的最新消息。如果这还不够,您可以尝试增加消费群体的分区和消费线程。

    是否使用
    min.compression.lag
    config获取“7天数据”?--另外,对于短期主题,您为什么说您使用1小时的保留时间:如果此短期主题没有完全压缩--否则您可能会失去初始状态?@MatthiasJ.Sax是的,我使用
    min.compression.lag
    。我使用1小时,因为数据量可以处理。我不希望丢失任何最新的关键数据。据我所知,最后一个密钥的保留是有保证的,并且独立于min.comaction.lag。我总是期望收到肮脏的信息;不确定“完全压缩”是什么意思我不希望丢失任何数据。——但你没有保证。所谓“完全压实”,我的意思是只使用原木压实(no
    min.compression.lag
    );当然,始终存在未压缩的活动段,但如果减少段大小和段滚动间隔(或
    max.compression.lag
    ),则应接近“完全压缩”主题(即,没有重复的键)。
    流式处理是潜在的错误源。如果暂时失败,应用程序将不再接收最新状态。
    ——为什么会有风险?您只使用“短期”主题进行引导,对吗?短期主题可能用于引导,也用于接收所有其他数据。我认为,只在引导时阅读它,然后切换到大的主题,看看是否有新的东西不会给我带来好处。谢谢你的建议。这并没有让事情变得更简单(对消费者而言),但至少我没有忽略任何更好地支持它的概念。我们似乎选择了
    短期->长期
    方向解决方案。在这种情况下,消费者不需要更改其引导过程(他们只处理
    短期
    主题);如果流式传输到
    LongTerm
    主题失败了一段时间,则存在数据丢失的风险;但是,由于这是一个卡夫卡过程,我们认为它运行得足够稳定。制作人是否可以将相同的数据发送到两个主题,每个主题为不同类型的客户服务?Cop