在我的 aws 帐户中,我为我的 SQS 消费者设置了 ASG。它的最小容量为 3,最大容量为 8。终止策略设置为“默认”。它有 2 个简单的扩展策略,附加到监控 SQS 队列大小的云监视警报。
这是云监视警报的阈值ApproximateNumberOfMessagesVisible >= 10 for 1 consecutive periods of 300 seconds for the metric dimensions
。
当云监视警报状态在 300 秒后为“警报”时,ASG 会添加 1 个实例,直到达到最大容量。同样,当云监视警报状态在 300 秒后为“正常”时,ASG 会删除 1 个实例,直到达到最小容量。
ASG 似乎可以毫无问题地扩展到最大容量。然而,我遇到的问题是在 ASG 缩减时发生的。当警报状态从“警报”变回“正常”时,ASG 似乎只是随机选择要关闭的实例。如果它正在关闭的实例当前正在处理 SQS 消息,则这是一个问题。
例如,如果我的 SQS 队列有 20 条可见消息,那么我的 ASG 将扩大,假设为 8。一旦可见消息低于或等于 10,ASG 将开始从我的 ASG 中终止实例。但是,它可能会选择一个正在处理 SQS 消息的实例。如果是这样,那么该 SQS 消息将进入我的 DLQ。
有没有人遇到过这个问题?
有没有办法将 ASG 配置为监控 SQS 长度并仅终止已完成消息处理的实例?也许当 SQS 是“好的”并且实例的 CPU 较低时?或者,我应该将我的云手表警报中的阈值设置为 2 之类的东西吗?