Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库脱机时如何不丢失来自Kafka的消息_Java_Spring Boot_Apache Kafka_Microservices_Spring Kafka - Fatal编程技术网

Java 数据库脱机时如何不丢失来自Kafka的消息

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中手动提交偏移量?处理卡夫卡消费者中的错误的最佳实践是什么?对于这种情况,您应该手动提交偏移量。仅当邮件处理成功时提交偏移

我正在开发微服务,它使用来自Kaffka的消息,然后处理这些消息并将输出存储到MongoDB

我是卡夫卡的新手,我遇到了一些丢失信息的问题

场景非常简单:

在mongoDB离线的情况下,microservice收到一条消息,然后试图将输出保存到Mongo,然后我得到一个错误,表示Mongo离线,消息丢失


我的问题是卡夫卡有任何机制在这种情况下停止发送消息。是否应该在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
的容器

因此,应用程序中的Autowire
KafkaListenerEndpointRegistry
registry端点

@Autowired
private KafkaListenerEndpointRegistry registry;
从注册表中获取
MessageListenerContainer

返回具有指定id的MessageListenerContainer,如果不存在此类容器,则返回null

参数:

id—容器的id

MessageListenerContainer
上,您可以使用
pause
resume
方法

默认无效暂停()

在下次轮询()之前暂停此容器

默认无效恢复()

如果暂停,在下一次轮询()后恢复此容器

public MessageListenerContainer getListenerContainer(java.lang.String id)