我的 Amazon Simple Queue Service (Amazon SQS) 队列中积压的消息增加了,我想防止消息增加。
简短描述
标准队列和 FIFO SQS 队列
在以下情况下,积压的消息会增加:
- 生产者发送消息的速度高于使用消息的速度。
- 使用者不会在可见性超时期内删除消息。轮询 SQS 队列时,消息会重新出现在队列中。
FIFO SQS 队列
对于 FIFO(先入先出)SQS 队列,消息积压的增加也可能由以下任一原因引起:
- FIFO 队列的 120,000 条消息缓冲区限制。
- 属于某个消息组的消息会被使用者卡住,这会阻止来自同一消息组的其他消息的处理。
解决方法
遵循这些最佳做法,以防止积压的消息增加。
标准队列和 FIFO SQS 队列
- 设置 SQS 队列最佳可见性超时时间,以允许使用者在可见性超时期内处理消息后删除消息。如果您不知道处理消息需要多长时间,请为您的使用者流程创建检测信号。指定初始可见性超时(例如,两分钟)。如果使用者需要更多时间来处理消息,请使用 ChangeMessageVisibility API 调用来延长可见性超时时间。
- 在调用 ReceiveMessage API 时增加批处理大小。将 MaxNumberOfMessages 参数值设置为大于 1,最大值为 10。
- 监控 SQS 队列指标可见消息的近似数量。该指标允许您查看生产者开始生成消息的速度是否高于使用者使用消息的速度。要横向扩展,请增加使用 SQS 队列的使用者或客户端的数量,或者增加轮询队列的线程数。
FIFO SQS 队列
120,000 条消息缓冲区
FIFO 队列最多可以有 120,000 条处于“传输”状态的消息。处于“传输”状态的消息包括使用者从队列中收到但尚未从队列中删除的消息。如果您达到了 120,000 配额,则 Amazon SQS 不会返回错误消息。
FIFO 队列会审核前 120,000 条消息,以确定可用的消息组。如果单个消息组中有积压的消息,则在成功使用这些积压的消息之前,您无法使用来自其他消息组的消息。
通过消息组扩展
属于同一消息组的消息会按照相对于消息组的顺序逐一处理。当您收到具有多个消息组 ID 的消息时,Amazon SQS 会尝试返回尽可能多的具有相同消息组 ID 的消息。这样其他使用者可以处理具有不同消息组 ID 的消息。
当属于特定消息组 ID 的消息不可见时,其他使用者均无法处理具有相同消息组 ID 的消息。但是,使用者可以处理来自其他消息组的消息。请尝试增加顺序不重要的消息组的数量。