如何防止 Elastic Beanstalk 上长时间运行的作业在不阻止缩减的情况下终止?

Posted

技术标签:

【中文标题】如何防止 Elastic Beanstalk 上长时间运行的作业在不阻止缩减的情况下终止?【英文标题】:How to prevent long running jobs on Elastic Beanstalk from being terminated without blocking scaling in? 【发布时间】:2018-07-10 20:48:39 【问题描述】:

我有许多并行工作人员在弹性 beantalk 工作环境中处理长时间运行的作业。底层 EC2 实例根据队列长度进行扩展。我的问题是工作人员在处理过程中被终止,而行动规模扩大。

我最初防止这种情况的方法如下: 在收到来自 sqs 守护程序的消息后,每个工作人员都在保护他正在运行的 EC2 实例。当工作人员准备好处理作业时,他会再次取消对 EC2 实例的保护。对于这种情况,这似乎是推荐的方法:https://aws.amazon.com/about-aws/whats-new/2015/12/protect-instances-from-termination-by-auto-scaling/ 除了没有考虑任何安置策略这一事实之外,它还有效。它导致所有实例都受到保护,并且大部分时间都取消了扩展操作。 sqs 守护进程似乎没有考虑用尽可能多的工作人员填充实例。

我的下一个考虑是在触发缩放操作时停止 sqs 守护程序,例如使用自动缩放生命周期挂钩。但是使用这种方法,终止受保护的实例可能仍然是一个问题(我不知道钩子是否在受保护的实例上触发)。此外,似乎不建议停止 sqs 守护进程:Start/stop sqsd daemon on Elastic Beanstalk to view SQS queue messages

如何使用弹性 beanstalk 工作程序层满足这两个要求(1. 不要停止长时间运行的工作程序和 2. 每个 EC2 实例运行尽可能多的工作程序)?

【问题讨论】:

【参考方案1】:

我对 Beanstalk 工作层实例不是很熟悉,但据我所知,它们一次只能完成 1 个任务,对吗?如果是这样,你为什么需要停止 SQS 守护进程,大概如果发生缩减,这是因为工作队列中没有更多的任务,所以这个实例不应该得到一个新的。如果恰好在那个时候出现了,它不会从 SQS 队列中删除,并且一旦可见性超时结束,就会被另一个工作节点拾取。

直到禁用实例保护后才会触发生命周期挂钩,因为它仅在选择要终止的实例时开始。

如果您能够在代码中添加一段逻辑,说明“如果任务结束并且没有新任务进入 -> 则禁用此实例上的实例保护” 这样只有没有任务的实例才能被终止。

或者,您可以让所有内容始终受到保护,并通过 Cron 作业定期在实例上运行 bash 脚本,检查它当前是否正在运行作业,如果没有,则禁用实例保护

【讨论】:

能否为您的主题添加标签。以便人们可以从标签中轻松识别您的问题。

以上是关于如何防止 Elastic Beanstalk 上长时间运行的作业在不阻止缩减的情况下终止?的主要内容,如果未能解决你的问题,请参考以下文章

如何在删除空S3 Elastic Beanstalk时修复“拒绝访问”?

在 Elastic Beanstalk EC2 上使用 EBS 卷的问题

如何使用TFS 2017部署到Elastic Beanstalk?

如何在 AWS elastic-beanstalk 中更改我的 python 版本

如何创建 Elastic Beanstalk 配置文件?

如何在 elastic-beanstalk 中应用 ruby​​ 版本补丁