【问题标题】:spring-cloud-aws. Manual deletion of SQS messages after messages being processed successfully春天云AWS。消息处理成功后手动删除 SQS 消息
【发布时间】:2015-04-07 20:42:22
【问题描述】:

Spring Cloud AWS(1.0.0.RC2)中SimpleMessageListenerContainer类的当前实现似乎在消息处理程序处理完消息并且方法调用返回后自动删除消息。

在我们的应用程序中,我们需要能够处理消息并等待来自下游队列的异步确认,然后再从 SQS 上游队列中删除消息。类似的东西

接收 SQS 消息 -> 处理消息 -> 将消息发布到 RabbitMQ(线程在此处完成)

删除 SQS 消息

由于 msg ack 通过不同的线程异步返回,我们需要在检查成功 ack 后手动从 SQS 中删除 msg。

理想情况下,SimpleMessageListener 应该可配置为它在哪种模式下运行(自动删除或手动删除)。

我们非常希望使用 spring aws cloud lib(而不是推出我们自己的)与 SQS 集成,因为它已经负责侦听器容器 bean 生命周期管理。

请让我知道上述建议的功能是否可行,如果可行,何时可以实施和发布。

谢谢。

【问题讨论】:

    标签: spring-cloud


    【解决方案1】:

    我们可以再添加一个标志(除了已经存在的 deleteMessageOnException 标志)以完全禁用消息的自动删除,即使在成功处理时也是如此。我看到的问题是不再处理有毒消息并且可能会炸毁队列。我为 here 创建了一个问题。

    您的方法会遇到另一个问题。如果消息没有被足够快地删除(基于可见性超时),它将再次出现在您的处理程序方法中。

    接收 SQS msg1 -> 处理 msg1 -> 将 msg1 发布到 RabbitMQ(线程在此处完成)

    接收 SQS msg2 -> 处理 msg2 -> 将 msg2 发布到 RabbitMQ(线程在此处完成)

    接收 SQS msg1 -> 处理 msg1 -> 将 msg1 发布到 RabbitMQ msg1 又来了,因为它没有被删除

    删除 SQS msg1

    目前一个非常丑陋的解决方法可能是在您的处理程序方法中抛出异常并将 deleteMessageOnException 标志设置为 false。因此不会删除任何消息,您可以获取回执句柄(使用 @Header@Headers)手动删除它们。

    编辑

    该问题现已修复,可以直接使用@SqsListener 注释定义删除策略并使用注入的确认对象。见this issue的最后一条评论

    【讨论】:

    • 当自动删除被完全禁用时,处理消息重复是应用程序的责任。我认为这是一个合理的权衡。通过这种方式,它使应用程序可以更好地控制消息的生命周期。这同样适用于处理有害消息。毒消息是指如果 JSON 有效负载无效或内容损坏,应用程序应该有机会决定如何处理消息(删除或死信)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多