首页 文章

AWS SQS - 在一条消息的可见性超时到期之前,队列不提供任何消息

提问于
浏览
2

EDIT :在我写作的时候解决了这个:P - 我喜欢那种解决方案 . 我认为我关心点/业力等等 . 我刚刚写完了所有内容,所以我想发布它和解决方案 .

我有一个SQS FIFO队列 . 它正在使用死信队列 . 以下是它的配置方式:

FIFO Queue Configuration

我有一个 生产环境 者微服务,我有10个ECS图像作为消费者运行 .

由于业务原因,我们必须处理接近它们在队列中传递的时间的消息 .

我们正在为 生产环境 者和消费者代码使用最新版本的AWS SDK Golang客户端软件包(如果重要的话,我可以查看版本,但它并不是非常过时) .

我捕获了 生产环境 者的日志,因此我确切地知道消息何时被放入队列以及消息是什么 .

我捕获了所有消费者的聚合日志,因此我可以全面了解所有10个消费者以及收到和处理消息的时间 .

这是我在正常情况下看到的日志:

  • 消息在时间x放入队列

  • 10个消费者中的一个在时间x收到消息

  • 消费者成功处理的消息

  • 消费者在时间x(0-2秒)从队列中删除的消息

  • 每天不同时间每天重复无限次最多约700条消息

但我现在看到的问题是有些消息没有得到及时处理 . 偶尔我们故意处理消息故意处理该消息的系统状态b / c(例如,用户仍然可以登录,因此它应该退回并重试......它会这样做) . 问题是如果消费者未通过消息导致队列停止向任何其他消费者传递任何其他消息 .

“无法处理消息”这里只是意味着收到了消息,但消费者声明它失败了,所以我们只记录错误,不要继续从队列中删除它 . 因此,可见性超时(此处为5m)将到期,并且将重新传递给另一个消费者并重试最多10次,之后它将进入死信队列 .

在深入研究并分析日志之后,这就是我所看到的:

  • 流程如上所述(生成,消费,删除消息) .

  • 消费者在时间x收到新消息

  • 消费者失败 - 记录错误并返回(不删除)

  • 在时间x 5m(可见性超时)再次收到相同的消息

  • 消费者失败 - 记录错误并返回(不删除)

  • 重复最多10次 - 消息进入死信队列

  • 收到新消息,但现在已经晚了50分钟!

  • 现在,在步骤2-7之间放入队列的所有消息都延迟了50分钟(5米可见性超时* 10次重试)

我读过的所有文档都告诉我队列不应该这样,但是我有一个付费的AWS支持计划,或者我还有其他正在使用的队列 .

对于重复数据删除,我们使用消息体的自动哈希 . 消息是小型JSON文档 .

我的期望是,如果我们有一条导致可见性超时的错误消息,那么当有可用的消费者时,队列仍然可以愉快地提供它可用的任何其他消息 .

1 回答

  • 4

    好的,事实证明我错过了文档中关于FIFO队列的这一小块信息:

    https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html

    enter image description here

    当您收到带有消息组ID的消息时,除非您删除该消息或该消息可见,否则不会再返回相同消息组ID的消息 .

    我确实使用了相同的消息组ID . 没有再考虑一下 . 请注意,如果您这样做并且您的任何一条消息都无法处理,它将备份队列中的所有其他消息,直到消息最终被处理为止 . 我的解决方案是更改消息组ID . 有一些业务逻辑ID我可以在它上面后缀,这对我有用 .

相关问题