【问题标题】:spring cloud stream kafka binder resetting a kafka topic(multiple partitions) offset to an arbitrary number programaticallyspring cloud stream kafka binder以编程方式将kafka主题(多个分区)偏移重置为任意数字
【发布时间】:2021-10-20 01:20:15
【问题描述】:

我需要将偏移量重置为数字。

详细要求:我的应用程序正在消耗来自 kafka 主题的消息并将其转储到 DB 中,假设 DB 在处理消耗的消息时出现故障(offset=10),直到 DB 停机应用程序消费消息直到偏移量 20。

现在 DB 在处理第 20 个偏移量消息时再次出现,现在我想再次将偏移量重置为 10,以便我可以将数据保存在数据库中。

我可以通过编程方式实现这一点(弹簧启动)吗? 我正在使用 Spring Cloud Stream binder kafka。

【问题讨论】:

    标签: java spring-boot apache-kafka spring-cloud-stream spring-cloud-stream-binder-kafka


    【解决方案1】:

    如果 DB 宕机了,为什么还要继续接收消息?

    只需配置侦听器容器以继续重试当前记录,直到数据库再次可用。

    @Bean
    ListenerContainerCustomizer<AbstractMessageListenerContainer<?, ?>> listenerContainerCustomizer() {
        return (container, topic, group) -> {
            container.setErrorHandler(...);
        };
    }
    

    https://docs.spring.io/spring-kafka/docs/current/reference/html/#seek-to-current

    【讨论】:

    • 嗨 Gary..感谢您的回答,我必须继续接收消息,因为每条消息我们都会进行一些计算并将计算的值推送到下游系统/主题,并且该值应该是最新的。我等不及 DB 起来了,它可以在没有 DB 的情况下工作,但是那些消费的消息应该存在于 DB 中以满足其他一些要求。所以这就是为什么当 DB 出现时我想将偏移重置为任意数字(DB 下降时的偏移值),不知何故我正在跟踪偏移值。那我该怎么做??我看到 'consumer.seek()' 方法可以解决它???
    • SCSt 没有为运行时的任意搜索提供 API。直接在消费者上调用 seek 将导致排序和偏移提交问题。一种解决方案是编写一个自定义错误处理程序并抛出一个异常,该异常包含有关哪些分区需要查找以及到哪里(以及上次轮询中的任何其他剩余分区)的信息。这不是简单的代码。您对 Spring Cloud Stream 的依赖程度如何?如果您直接使用 Spring for Apache Kafka,则可以执行查找。
    • 另一种选择,也许更简单,可能是使用手动确认进行偏移提交,并在数据库关闭时停止确认;当它恢复时停止并重新启动绑定,消费将从您停止确认记录的点开始。
    • 感谢 Gary,将尝试这些方法
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2019-04-17
    • 2018-10-14
    • 2019-03-16
    • 1970-01-01
    • 2017-11-20
    • 2018-12-16
    • 2021-02-17
    相关资源
    最近更新 更多