Java 数据库脱机时如何不丢失来自Kafka的消息
我正在开发微服务,它使用来自Kaffka的消息,然后处理这些消息并将输出存储到MongoDB 我是卡夫卡的新手,我遇到了一些丢失信息的问题 场景非常简单: 在mongoDB离线的情况下,microservice收到一条消息,然后试图将输出保存到Mongo,然后我得到一个错误,表示Mongo离线,消息丢失Java 数据库脱机时如何不丢失来自Kafka的消息,java,spring-boot,apache-kafka,microservices,spring-kafka,Java,Spring Boot,Apache Kafka,Microservices,Spring Kafka,我正在开发微服务,它使用来自Kaffka的消息,然后处理这些消息并将输出存储到MongoDB 我是卡夫卡的新手,我遇到了一些丢失信息的问题 场景非常简单: 在mongoDB离线的情况下,microservice收到一条消息,然后试图将输出保存到Mongo,然后我得到一个错误,表示Mongo离线,消息丢失 我的问题是卡夫卡有任何机制在这种情况下停止发送消息。是否应该在Kafka中手动提交偏移量?处理卡夫卡消费者中的错误的最佳实践是什么?对于这种情况,您应该手动提交偏移量。仅当邮件处理成功时提交偏移
我的问题是卡夫卡有任何机制在这种情况下停止发送消息。是否应该在Kafka中手动提交偏移量?处理卡夫卡消费者中的错误的最佳实践是什么?对于这种情况,您应该手动提交偏移量。仅当邮件处理成功时提交偏移量。你可以像下面这样做。但是,您应该注意,消息具有ttl,因此在ttl过去后,消息会自动从kafka代理中删除
consumer.commitSync();
我认为与其手动提交,不如使用Kafka Streams和Kafka Connect。管理两个系统之间的事务:ApacheKafka和MongoDB可能不是那么容易,所以更好地使用已经开发和测试的工具(您可以阅读更多关于Kafka Connect:,) 您的场景可能是这样的:
- 使用处理您的邮件,并将结果发送给新用户 主题(卡夫卡流只支持一次语义)
- 使用Kafka Connect(接收器连接器)在MongoDB中保存数据
MessageListenerContainer
上使用pause
和resume
方法(但必须使用spring kafka>2.1.x)
@KafkaListener生命周期管理
为@KafkaListener
注释创建的侦听器容器不是应用程序上下文中的bean。相反,它们是在类型为KafkaListenerEndpointRegistry
的基础结构bean中注册的。这个bean由框架自动声明并管理容器的生命周期;它将自动启动所有autoStartup
设置为true
的容器
因此,应用程序中的AutowireKafkaListenerEndpointRegistry
registry端点
@Autowired
private KafkaListenerEndpointRegistry registry;
从注册表中获取MessageListenerContainer
返回具有指定id的MessageListenerContainer,如果不存在此类容器,则返回null
参数:
id—容器的id
在MessageListenerContainer
上,您可以使用pause
或resume
方法
默认无效暂停()
在下次轮询()之前暂停此容器
默认无效恢复()
如果暂停,在下一次轮询()后恢复此容器
public MessageListenerContainer getListenerContainer(java.lang.String id)