我们有一个自动扩展组,用于生成工作服务器。每个工作服务器都运行 celery 进程。我们使用 cloudwatch 监控 celery 队列长度,并根据该队列长度生成/终止自动扩展服务器。您在此答案中看到的是我们这样做的方式:有没有办法使用 Celery 使用的 RabbitMQ 队列的长度来启动自动缩放组中的实例?
我们的终止策略是首先终止最老的服务器。当队列长度连续 300 秒为零时,就会发生这种情况。
正常设置有 3 台始终可用的服务器。仅当队列长度超过一定数量时,自动缩放组才会启动。假设队列中有 10 个作业持续 30 秒。
我没有在我的 celery 配置中设置任何路由或优先级。
问题就在这里。当规模缩小时,我并不完全确定被杀死的主机是否空闲,因为所有工作进程都受到同等对待。任务有时需要 5-10 分钟,如果服务器正在执行任务,我不希望它被杀死
到目前为止我还没有遇到任何问题。但我担心我们的一些客户可能会因此遇到问题
答案1
当实例处于“终止:等待”状态时,您可以使用生命周期事件执行自定义操作。
按照步骤创建生命周期钩子这一页,复制如下。在此状态下,脚本或 Lambda 可以保持实例打开,直到所有作业完成。我链接到的页面包含有关冷却期的更多信息。
Auto Scaling 组通过启动实例来响应扩展事件,通过终止实例来响应缩减事件。
生命周期钩子将实例置于等待状态(Pending:Wait 或 Terminating:Wait)。实例将暂停,直到您继续或超时期限结束。
您可以使用以下一个或多个选项执行自定义操作:
定义 CloudWatch Events 目标以在发生生命周期操作时调用 Lambda 函数。当 Amazon EC2 Auto Scaling 向 CloudWatch Events 提交生命周期操作事件时,将调用 Lambda 函数。该事件包含有关正在启动或终止的实例的信息,以及可用于控制生命周期操作的令牌。
为生命周期挂钩定义通知目标。Amazon EC2 Auto Scaling 向通知目标发送一条消息。该消息包含有关正在启动或终止的实例的信息,以及可用于控制生命周期操作的令牌。
创建一个在实例启动时在实例上运行的脚本。该脚本可以使用其运行的实例的 ID 来控制生命周期操作。
默认情况下,实例将处于等待状态一小时,然后 Auto Scaling 组将继续启动或终止过程(Pending:Proceed 或 Terminating:Proceed)。如果您需要更多时间,可以通过记录心跳来重新启动超时期限。如果您在超时期限结束前完成,则可以完成生命周期操作,从而继续启动或终止过程。