【问题标题】:Kafka retry on same topicKafka重试同一主题
【发布时间】:2018-11-25 21:24:28
【问题描述】:

我们想为失败创建一个重试 kafka 机制。我看到很多人介绍了一种拥有多个“重试”主题的方式。想知道为什么我不能通过克隆消息来简化流程,在其中添加一个重试计数器字段,然后在同一主题上重新生成它,直到达到 X 次然后用尽。

我错过了该机制的什么?

【问题讨论】:

    标签: apache-kafka kafka-consumer-api kafka-producer-api


    【解决方案1】:

    基本上,您错过了重试策略中应该存在的可配置延迟。您提出的简单方法将在某些中断期间导致非常高的 CPU 使用率(例如,您依赖的某些服务在几分钟或几小时内不可用)。最好的方法是采用指数退避策略 - 每次重试都会增加延迟,之后会再次重试消息处理。而这种“交货延迟”是 Kafka 不支持的。

    【讨论】:

    • 所以现在我需要实施退避策略。 DLQ呢?那么它会要求我开始维护每条消息的状态?
    • 消息的整个状态只是已经完成的重试次数(当然消息内容除外)。一个消息队列会为你保留你在向DLQ发送消息时设置的“投递延迟”。
    • “消息队列”是什么意思?你能解释一下吗?我还要在哪里存储每条消息的重试次数?
    • 只需在互联网上搜索该术语。重试次数可以作为自定义标头附加到消息(消息标头是大多数消息传递系统的常见功能)。
    • 所以您建议创建某种通用库来维持消息头中的重试次数,并在失败后再次向同一个 kafka 重新生成相同的消息?再加上一个决策逻辑,如果重试次数已达到重新调度到专用 DLQ.. 相当多的逻辑要自己编写,对吗?
    【解决方案2】:

    不确定我是否正确理解了这个问题。不过,我建议你有一些 Kafka 的“重试”策略。

    • “重试”主题中的消息已在“重试时间戳”中排序 订购
    • 因为在失败的情况下推迟消息处理不是一个简单的过程
    • 如果您想推迟处理 一些消息,您可以将它们重新发布到单独的主题中,一个用于 每个都有一些延迟值
    • 失败的消息处理可以是 通过克隆消息然后将其重新发布到其中之一来实现 重试主题
    • 重试主题的消费者可能会阻塞线程 (除非是时候处理消息了)

    【讨论】:

    • 感谢您的回复。 “重试”主题中的消息如何已按“重试时间戳”顺序排序?我的意思是,如果我分批接收它们,那么有一个通道会错过重试缓冲时间,因为同一条消息不会出现在该批次中
    猜你喜欢
    • 2021-08-10
    • 2020-04-12
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2022-11-29
    • 2018-04-05
    相关资源
    最近更新 更多