问题描述
有一个处理服务器,它会处理SQS队列中的请求,每天大约有10个请求,每个请求处理时间大约为2分钟。有时候处理过程会“卡住”,理想情况下希望能终止自动扩展组中的单个服务器,但保持自动扩展组大小为1,因为问题通常可以通过自动扩展创建一个新的服务器来解决。用户想知道是否可以仅通过自动扩展配置来实现这一点,还是需要创建一个带有步骤或Lambda函数的单独进程?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
为了实现在保持自动扩展组大小为1的情况下,根据SQS队列条件终止单个处理服务器,可以使用以下配置:
1. 将自动扩展组(ASG)的期望容量设置为0,当ApproximateNumberOfMessagesVisible
为0持续5分钟时。
2. 将自动扩展组(ASG)的期望容量设置为1,当ApproximateNumberOfMessagesVisible
大于等于1时。
3. 将所有消息的VisibilityTimeout
设置为10分钟。
下面是一个可能的故障场景:
1. 在0分钟时,有1个消息正在被处理。此时队列中没有其他消息,ApproximateNumberOfMessagesVisible
为0。
2. 在2分钟时,我们假设处理程序现在卡住了。此时不会采取任何操作。
3. 在5分钟时,自动扩展组(ASG)的缩容事件触发,期望容量设置为0(因为没有待处理的工作)。
4. 在10分钟时,由于可见性超时,SQS会自动将消息重新放入队列中,此时ApproximateNumberOfMessagesVisible
为1。
5. 不久之后,自动扩展组(ASG)的扩容事件触发,期望容量设置为1(因为有待处理的工作)。
需要注意的是,3分钟和5分钟的间隔是任意的,它们只是强调了对于这样一个不稳定的系统,需要一个短暂的等待期。
参考链接:
– SQS可见性超时
– SQS可用的CloudWatch指标
方案2
另一种方法是使用AWS Automation文档在状态更改时修改自动扩展组为0,然后再恢复为1。这将导致服务器终止并重新创建。
以上是两种可能的解决方案,您可以根据实际情况选择适合您的方式。如果您的处理服务器是一个ECS服务,那么重构您的处理程序可能比持续手动干预更省力,并且可以节省成本。
请注意,这些解决方案都是在给定的约束条件下提出的,可能不是最佳的后端工作程序解决方案。
以上是根据提供的问答数据和我的知识库生成的解决方案。希望对您有所帮助!