如何在AWS AutoScaling终止EC2实例时在Tomcat上完成长时间运行的任务?
问题描述:
我有一个应用程序部署到托管在ElasticBeanstalk环境上并启用自动缩放的Tomcat 8。在应用程序中,我必须完成长时间运行的作业,并且必须将所有更改都提交到数据库。如何在AWS AutoScaling终止EC2实例时在Tomcat上完成长时间运行的任务?
问题是AWS可能会在缩放期间杀死任何EC2实例,然后可能会有一些作业没有按预期完成。默认情况下,AWS仅等待30秒,然后终止Tomcat进程。
我已经更改/etc/tomcat8/tomcat8.conf
文件:将参数SHUTDOWN_WAIT
设置为3600
(默认为60
)。但它没有解决问题 - 整个实例在20-25分钟后死亡。
然后我试图通过.ebextensions
文件来配置生命周期挂钩(因为它的解释here)。但我无法批准生命周期挂钩确实推迟实例的终止(仍在等待AWS支持的答案)。
所以问题是:你知道任何“合法”的方式来推迟或取消实例终止时,自动调整组缩放吗?
我想有这样的事情:
- AWS启动自动缩放组缩放
- 自动缩放群发关机信号EC2实例
- EC2实例启动时停止所有活动进程
- Tomcat进程收到关闭的信号,但一直等到活动作业完成
- 应用程序提交作业结果(可能会采取甚至60分钟)
- Tomcat进程被终止
- EC2实例在终止
答
弹性豆茎由两个部分组成 - API,和工人。 API是自动缩放的,所以它可以下降。工人的运转时间更长。您可以使用SQS与他们进行通信。这就是他们设计的方式。
当然,你可以调整系统。这就是平台即服务,因此您可以强制自动缩放组不要关闭 - 通过将最小实例设置为最大。你也可以关闭健康检查 - 也可以杀死实例...但这是黑客攻击,后者可以踢。
这可以是暂停:https://stackoverflow.com/questions/42348571/aws-scaling-in-termination-protection-for-ec2-container-service/42351705#42351705 – Mahdi