首页 文章

如何防止Elastic Beanstalk上长时间运行的作业被终止而不阻塞扩展?

提问于
浏览
5

我有许多并行工作者在弹性beanstalk工作环境中处理长时间运行的作业 . 基于队列的长度来缩放基础EC2实例 . 我的问题是工作人员在处理期间被终止,同时发生了缩放操作 .

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

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

如何通过弹性beanstalk工作层满足这两个要求(1.不要阻止长时间运行的工作人员和2.尽可能多地运行每个EC2实例的工作人员)?

1 回答

  • 0

    我不是很熟悉Beanstalk工作层实例,但据我所知,他们一次只能获得1个任务,对吗?如果是这样,为什么你需要停止SQS守护进程,大概是因为正在进行扩展,因为工作队列中没有更多的任务,所以这个实例不应该得到一个新的 . 如果确实恰好在那一刻进入,它将不会从SQS队列中删除,并且一旦可见性超时结束将被另一个工作节点拾取 .

    在禁用实例保护之后才会触发生命周期钩子,因为它仅在选择终止实例时才会启动 .

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

    或者,您可以保持一切不受保护,并通过Cron作业定期在实例上运行bash脚本,检查它当前是否正在运行作业,如果不是则禁用实例保护

相关问题