Spring 卡夫卡消费者中死信队列的最佳选择是什么
我在写一本卡夫卡的书。消费者的工作主要是创建多个db实体,并在处理负载后保存它们。我试图编写代码来处理在使用数据时可能发生的错误。 为此,我可以想到2个选项(在春季生态系统中)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中:
感谢您的回复。我认为使用卡夫卡是最好的解决方案 因为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。