Java 当aws自动缩放组成员被销毁,并且有优秀的Spring异步线程在做这些事情时会发生什么?
我有一个Spring应用程序,它今天使用Java 当aws自动缩放组成员被销毁,并且有优秀的Spring异步线程在做这些事情时会发生什么?,java,spring,asynchronous,tomcat8,aws-ec2,Java,Spring,Asynchronous,Tomcat8,Aws Ec2,我有一个Spring应用程序,它今天使用@Async方法来处理一些非必要但信息丰富的东西。它工作得很好 我想将一些新的处理移到应用程序的这个角落,但我不完全理解如果通过AWS关闭它,它正在运行的ec2实例会发生什么 此应用程序作为自动缩放组的一部分在AWS中的Tomcat 8上运行。我们经常进行部署,并且经常上下扩展,所以机器终止是例行的。我知道这可能会导致一些线程在中途停止,这是可以接受的 现有用例:“通过Slack向中层管理人员报告最后一小时的销售额。” 我知道机器关闭可能会导致未发布该松弛
@Async
方法来处理一些非必要但信息丰富的东西。它工作得很好
我想将一些新的处理移到应用程序的这个角落,但我不完全理解如果通过AWS关闭它,它正在运行的ec2实例会发生什么
此应用程序作为自动缩放组的一部分在AWS中的Tomcat 8上运行。我们经常进行部署,并且经常上下扩展,所以机器终止是例行的。我知道这可能会导致一些线程在中途停止,这是可以接受的
现有用例:“通过Slack向中层管理人员报告最后一小时的销售额。”
我知道机器关闭可能会导致未发布该松弛消息,这没关系。这只是中层管理人员
新用例:“每天早上5:00通过电子邮件向高级管理层报告最后一天的销售情况。”
如果此报告需要很长时间才能运行,则如果电源线被拉断,运行它的线程更有可能停止
我知道如何防范这种情况,并通过Redis等使事情“有点原子化”,但这不会扩展到连续故障或任务持续时间最终超过ec2生命周期,我想更深入地了解ec2实例是如何“关闭”的命令通过@Async
方法调用影响当前正在运行代码的正在运行的jvm线程
我不想在Lambda中运行这些东西,也不想在带外运行其他东西,因为我们的域位于这个代码库中,并且经常更新
我在谷歌上搜索了一下这个主题,几乎所有的结果都会产生他们的应用程序容器的主题,在这个场景中不会关闭,这与我正在寻找的信息相反
谢谢
-neil的回答听起来有点骇人听闻,但假设关键的
@Async
处理可以发生在任何框上(或发生在所有框上),那么您可以让实例在开始关键处理时调用aws CLI,并在完成后再次调用它吗?它应该能够以这种方式启用实例保护
使用以下“更新自动缩放组”命令为指定的自动缩放组启用实例保护:
以及文件的其他部分:
如果自动缩放组中的所有实例在“缩放入”过程中都受到保护,不会终止,并且发生“缩放入”事件,则自动缩放会减少所需的容量。但是,在禁用实例保护设置之前,自动缩放无法终止所需数量的实例
实例保护不会通过Amazon EC2控制台、terminate instances命令或TerminateInstances API保护自动缩放实例,以防手动终止。如果自动缩放实例未通过运行状况检查且必须更换,则实例保护不会保护该实例不被终止。此外,实例保护不会保护自动缩放组中的Spot实例免受中断
或者,如果只有一个框需要运行它,那么应该可以将一个专用实例作为处理框进行保护,并且您只需确保该实例就是执行关键异步处理的实例。这里有几点需要注意:
未运行
(与缺席相同)、运行
、失败
、完成
。除了未运行的之外,所有的都将具有上次更新时间戳,对于正在运行的作业,该时间戳将定期持续更新。还有负责运行作业的实例/进程/线程标识符。如果作业标记为正在运行,但更新丢失的时间间隔超过X个,则可以将前一个运行程序声明为失败,并且观察到此情况的下一个实例可以拥有此作业的所有权(更新所有者)
如果整个cloudformation堆栈被“销毁”,这不会保护实例不被终止。如果父cloudformation堆栈被破坏,有一个“保留”ec2实例的策略,但是我找不到一个api来为给定实例翻转该位。
aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --protected-from-scale-in