【问题标题】:How to finish long-running task on Tomcat when AWS AutoScaling is terminating the EC2 instance?当 AWS AutoScaling 终止 EC2 实例时,如何在 Tomcat 上完成长时间运行的任务?
【发布时间】:2017-11-24 05:03:39
【问题描述】:

我有一个部署到 Tomcat 8 的应用程序,该应用程序托管在启用了自动缩放的 ElasticBeanstalk 环境中。在应用程序中,我有必须完成的长时间运行的作业,并且所有更改都必须提交到数据库。

问题在于 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 实例已终止

【问题讨论】:

标签: amazon-web-services amazon-ec2 autoscaling aws-ebs


【解决方案1】:

Elastic Beanstalk 由两部分组成 - API 和 Worker。 API 是自动缩放的,所以它可以下降。工人是运行时间更长的东西。您可以使用 SQS 在它们之间进行通信。他们就是这样设计的。

当然,您可以调整系统。那是平台即服务,因此您可以通过将最小实例设置为最大来强制自动扩展组不要关闭。你也可以关闭健康检查 - 这也可以杀死实例......但那是黑客攻击,后者可以踢。

【讨论】:

    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 2020-03-16
    • 2018-12-31
    • 2020-03-26
    • 2015-02-24
    • 2017-03-31
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多