Spring cloud stream 处理失败时重新查询运动信息
Spring Cloud Stream Kinesis Binder是否支持如上所述的消息重新查询 在我的Spring cloud stream 处理失败时重新查询运动信息,spring-cloud-stream,Spring Cloud Stream,Spring Cloud Stream Kinesis Binder是否支持如上所述的消息重新查询 在我的@StreamListener中,我抛出了一个新的org.springframework.cloud.stream.binder.RequeCurrentMessageException,但是我在我的日志中看到,org.springframework.integration.aws.inbound.kinesis.KclMessageDrivenChannelAdapter正在记录考虑对补偿
@StreamListener
中,我抛出了一个新的org.springframework.cloud.stream.binder.RequeCurrentMessageException
,但是我在我的日志中看到,org.springframework.integration.aws.inbound.kinesis.KclMessageDrivenChannelAdapter
正在记录考虑对补偿逻辑使用“errorChannel”流,然后在日志中立即看到碎片被检查点。在阅读了关于如何使用SpringCloudStream重新查询消息的文档之后,这不是我所期望的行为。我希望Kinesis消息将被重新传递,而我的@StreamListener
将再次处理相同的消息
目前,我们正在使用Spring Cloud Stream Kinesis Binder2.0.1。发行版
您可能需要了解更多关于Kinesis及其工作原理的信息。只是没有一个记录。检查点是关于从碎片读取一些记录后的偏移量提交
从技术上讲,我们甚至可能根本不想检查点,我们仍然需要下一个迭代器进行处理。我们需要检查点,以防应用程序崩溃。所以,下次我们重新启动时,我们将从离开的地方继续。Kinesis流处理背后的逻辑与ApacheKafka完全相似:一些记录日志和光标在其中穿行。为了记住我们所处的位置,最好不时地存储该位置。虽然这不是强制性的
关键是,我们不单独处理来自碎片的记录:我们确实得到了一些从流中请求碎片迭代器的记录集。如果我们在该集合中的某些消息失败,并不意味着整个迭代器无法提交
作为错误处理的问题,使用Kinesis可以从特定偏移量(返回日志)重新开始消费,但我们可能会再次处理其余记录
因此,最好在目标应用程序中处理记录错误,并让Kinesis在处理偏移量时提交偏移量。错误处理程序可能会将失败的消息重新发送回同一个流,或将其存储到其他死信流中
提到的异常有以下JavaDoc:
/**
* When using a {@code PollableMessageSource} throw this exception to cause the current
* message to be requeued in the broker so that it will be redelivered on the next poll.
*
* @author Gary Russell
* @since 2.1
*
*/
public class RequeueCurrentMessageException extends RuntimeException {
KclMessageDrivenChannelAdapter
不可轮询,因此引发这样的异常不会有任何区别。即使我们能够以某种方式处理它,它仍然不会被重新交付,因为根据它的体系结构,在Kinesis中没有这样的东西。如果我使用手动检查点,并且在处理消息时遇到错误时不检查点,如何确保我的@StreamListener
在不重新启动微服务的情况下重新处理消息?下一次碎片迭代会将相同的消息重新传递给我的服务吗?我知道它也可能传递我能够成功处理的消息,我们也必须有逻辑来检测这些消息。不,不是。光标仍处于活动状态,并处于内存位置。它将向您提供下一组记录。检查点仅在重启之间相关。要重新传递失败的消息,需要从错误处理程序将其发送回该流。