我的 Amazon Simple Queue Service (Amazon SQS) 队列中的积压消息正在日益增多。为什么会发生这种情况,我怎样才能防止积压消息的增多?
简短描述
标准和 FIFO SQS 队列
在以下情况下,积压的消息会增多:
- 生产者发送消息的速度超过使用消息的速度。
- 消费者未在可见性超时期限内删除消息。轮询 SQS 队列时,消息重新出现在队列中。
FIFO SQS 队列
对于 FIFO (先进先出) SQS 队列,消息积压的增多也可能是由以下任一原因造成的:
- FIFO 队列存在 20,000 条消息缓冲区限制。
- 属于消息组的消息被消费者阻塞,从而阻止处理来自同一消息组的其他消息。
解决方法
请遵循以下最佳实践以防止积压的消息增多。
标准和 FIFO SQS 队列
- 设置 SQS 队列最佳可见性超时,以允许消费者在可见性超时期限内处理消息后将其删除。如果不知道处理消息需要多长时间,那么为消费者流程创建检测信号。指定初始可见性超时 (例如,2 分钟)。然后,如果消费者需要更多时间来处理消息,请使用 ChangeMessageVisibility API 调用继续增加可见性超时。
- 当您进行 ReceiveMessage API 调用时,增加批处理大小。将 MaxNumberOfMessages 参数值设置为大于 1,最多设置为 10。
- 监控 SQS 队列指标“可见消息的大致数量”。此指标可让您了解生产者是否开始以高于消费者使用消息的速度产生消息。要横向扩展,请增加使用 SQS 队列的消费者或客户端的数量,或者增加轮询队列的线程数。
FIFO SQS 队列
20,000 条消息缓冲区
FIFO 队列最多允许 20,000 条飞行状态消息。飞行状态消息包括消费者从队列中收到但尚未从队列中删除的消息。如果您达到 20,000 条消息的配额,Amazon SQS 不会返回错误消息。FIFO 队列查看前 20,000 条消息以确定可用的消息组。如果单个消息组中有积压的消息,则在成功使用积压中的消息之前,您无法使用来自其他消息组的消息。
扩展消息组
属于同一消息组的消息按照相对于消息组的顺序逐个处理。当接收具有多个消息组 ID 的消息时,Amazon SQS 会首先尝试返回具有相同消息组 ID 的尽可能多消息。这可让其他消费者处理具有不同消息组 ID 的消息。当属于特定消息组 ID 的消息不可见时,任何其他消费者都不能处理具有相同消息组 ID 的消息。但是,消费者可以处理来自其他消息组的消息。尝试增加顺序不重要的消息组中的数量。