从 AWS SQS 获取消息的延迟

Posted

技术标签:

【中文标题】从 AWS SQS 获取消息的延迟【英文标题】:Delay in getting messages from AWS SQS 【发布时间】:2021-10-11 08:54:05 【问题描述】:

我在 Lambda 上的 SQS 中添加消息,然后在 ECS 上的容器内接收消息。 问题是当我在容器上接收消息时会有 10-15 秒的延迟。

在容器上,我每 1 秒无限期地运行一个循环,在该循环中我正在获取消息并在可用时对其进行处理。

示例: 假设消息在 15:20:00 添加到 SQS,但我能够在 ECS 上的 15:20:15 获取该消息。这 15 秒对我的用例来说太长了。

这个时间可以减少吗? 假设有多个生产者和消费者,是否有任何替代解决方案?

【问题讨论】:

队列中是否还有其他消息,或者是唯一的消息?如果还有其他消息,则容器中的工作人员可能很忙并且没有请求所有消息。 不,SQS 中只有 1 条消息。我用多条消息尝试了这个,也只有一条消息,行为是一样的。 Amazon SQS 中的消息在发送后立即可用。您的工作人员没有正确检索消息,或者它可能是一个 FIFO 队列,并且正在处理具有相同 MessageGroupId 的另一条消息。 我使用的是标准队列。您能说出针对此问题检索消息的正确方法吗? 接收消息的唯一方法是致电ReceiveMessage()。我建议您进行一些日志记录,以准确查看工作人员何时以及多久调用一次ReceiveMessage()。一种有效的方法是将WaitTimeSeconds=20 指定为参数,这将导致请求“等待”最多20 秒,然后返回空结果。这减少了不断轮询队列的需要。 【参考方案1】:

如果您的工作人员不断轮询 Amazon SQS 队列,他们可以通过指定 WaitTimeSeconds=20(这是其最大值)来减少请求数量。

这告诉 Amazon SQS 等待至少一条消息可用,最多等待 20 秒。如果 20 秒后没有消息可用,则返回一组空消息。但是,如果队列中出现一条或多条消息,则调用立即返回,无需等待 20 秒。

这会降低对 SQS 的调用频率,并可能提高您应用程序的稳定性。

【讨论】:

以上是关于从 AWS SQS 获取消息的延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何将Amazon SQS与Dynamodb集成

AWS - 从EC2连接到SQS

从 AWS Lambda 读取 SQS 队列

AWS SQS 消息保留期

Amazon SQS 延迟队列

使用SQS接收SES消息