Spring 卡夫卡消费者中死信队列的最佳选择是什么

Spring 卡夫卡消费者中死信队列的最佳选择是什么,spring,apache-kafka,kafka-consumer-api,spring-kafka,dead-letter,Spring,Apache Kafka,Kafka Consumer Api,Spring Kafka,Dead Letter,我在写一本卡夫卡的书。消费者的工作主要是创建多个db实体,并在处理负载后保存它们。我试图编写代码来处理在使用数据时可能发生的错误。 为此,我可以想到2个选项(在春季生态系统中) 将失败消息发送到死信卡夫卡主题 将失败消息发送到新的DB表(错误表) 需要再次处理失败的消息 在案例1中: 我还要写另一个@KafkaListner,它听死信主题并处理消息。这里的问题是,我无法更好地控制如何启动重新处理流程。(像调度器)因为KafkaListener将在死信主题中发布数据后立即开始处理数据 在案例2中:

我在写一本卡夫卡的书。消费者的工作主要是创建多个db实体,并在处理负载后保存它们。我试图编写代码来处理在使用数据时可能发生的错误。 为此,我可以想到2个选项(在春季生态系统中)

  • 将失败消息发送到死信卡夫卡主题
  • 将失败消息发送到新的DB表(错误表)
  • 需要再次处理失败的消息

    在案例1中: 我还要写另一个@KafkaListner,它听死信主题并处理消息。这里的问题是,我无法更好地控制如何启动重新处理流程。(像调度器)因为KafkaListener将在死信主题中发布数据后立即开始处理数据

    在案例2中: 我对重新处理流有更多的控制,因为我可以编写一个REST端点或调度程序,它将尝试重新处理失败的消息。 (在这里,我有一个两难的选择:使用哪个数据库。关系数据库还是某个键值存储库)

    我基本上处于设计困境,无法确定哪种方法在春季生态系统中更好。


    感谢您的回复。

    我认为使用卡夫卡是最好的解决方案

    因为KafkaListener将在死信主题中发布数据后立即开始处理数据

    您可以通过将该侦听器上的
    autoStartup
    设置为false来控制行为,然后根据需要使用
    KafkaListenerEndpointRegistry
    启动/停止侦听器:

    registry.getListenerContainer(myListenerId).start();
    

    或者,您可以使用自己的
    KafkaConsumer
    (由消费者工厂创建),轮询任意数量的记录,并在完成后关闭消费者。

    我同意Gary Russell的答案,您可以创建
    KafkaConsumer
    实例并控制其生命周期。该类来自
    org.apache.kafka:kafka客户端
    library

    在您的特定情况下,您可以添加
    Thread.sleep(schedulerDelay)
    以实现调度。以下是简化的示例:

    @Component
    class Scheduler() {
    
      public void init() {
        // create kafka consumer connected to your DLQ topic
      }
    
      public void run() {
        try {
          while (running) {
            ConsumerRecords<String, String> records = consumer.poll(1000);
            for (ConsumerRecord<String, String> record : records)
              processRecordLogicGoesHere(record);
            Thread.sleep(schedulerDelay);
          }
        } finally {
          consumer.close();
        }
      }
    
    }
    
    @组件
    类调度程序(){
    公共void init(){
    //创建连接到DLQ主题的卡夫卡消费者
    }
    公开募捐{
    试一试{
    (跑步时){
    ConsumerRecords记录=consumer.poll(1000);
    对于(消费者记录:记录)
    ProcessRecordLogicGoesher(记录);
    线程睡眠(schedulerDelay);
    }
    }最后{
    consumer.close();
    }
    }
    }
    
    应小心拾取
    schedulerDelay
    ,以跟上传入的消息,并且不要让它们因Kafka的日志清理策略而丢失

    关于如何使用卡夫卡的官方API,有很多教程,以下是其中之一:


    此外,您可以在这里找到一些想法:

    从概念上讲,使用bare
    KafkaConsumer
    PollingConsumer
    模式的实现。Spring的
    KafkaListener
    事件驱动消费者模式的实现。这两个来自《企业集成模式》一书。非常感谢您的帮助!。我会调查的。非常感谢!。我面临这个困境,因为在我们的企业中,kafka消息保留期最多为72小时。整个kafka平台由不同的团队管理。因此,我想到了将失败的消息保存到DB。