Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当aws自动缩放组成员被销毁,并且有优秀的Spring异步线程在做这些事情时会发生什么?_Java_Spring_Asynchronous_Tomcat8_Aws Ec2 - Fatal编程技术网

Java 当aws自动缩放组成员被销毁,并且有优秀的Spring异步线程在做这些事情时会发生什么?

Java 当aws自动缩放组成员被销毁,并且有优秀的Spring异步线程在做这些事情时会发生什么?,java,spring,asynchronous,tomcat8,aws-ec2,Java,Spring,Asynchronous,Tomcat8,Aws Ec2,我有一个Spring应用程序,它今天使用@Async方法来处理一些非必要但信息丰富的东西。它工作得很好 我想将一些新的处理移到应用程序的这个角落,但我不完全理解如果通过AWS关闭它,它正在运行的ec2实例会发生什么 此应用程序作为自动缩放组的一部分在AWS中的Tomcat 8上运行。我们经常进行部署,并且经常上下扩展,所以机器终止是例行的。我知道这可能会导致一些线程在中途停止,这是可以接受的 现有用例:“通过Slack向中层管理人员报告最后一小时的销售额。” 我知道机器关闭可能会导致未发布该松弛

我有一个Spring应用程序,它今天使用
@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实例免受中断



或者,如果只有一个框需要运行它,那么应该可以将一个专用实例作为处理框进行保护,并且您只需确保该实例就是执行关键异步处理的实例。

这里有几点需要注意:

  • 直接回答您的问题:

    当aws自动缩放组成员被销毁和删除时会发生什么情况 有优秀的Spring异步线程在做什么

    线程得到中断异常

  • 您描述的场景实际上不适合自动缩放实例。那些是为处理交通而设计的。您的场景更多地是关于作业处理的。专用(可能是预定的)实例(舰队)更适合于此。如果需要运行其中许多实例,可以安排Spot实例以降低成本。如果您通常在流量处理机器上运行作业,那么听起来您在应用程序中混合了关注点,最好将它们分开

  • 在该实例中,我将运行应用程序,该应用程序对作业进行一些状态管理。您可以自己编写,使用诸如DynamoDB之类的持久存储(Elasticache没问题,但如果失败了怎么办?),或者让其他工具为您编写(如Oozie、Chronos/Airflow,具体取决于您的首选语言)

    如果自己实现,每个报告间隔(比如一天)都会有一个记录。状态机将是:
    未运行
    (与缺席相同)、
    运行
    失败
    完成
    。除了未运行的
    之外,所有的
    都将具有上次更新时间戳,对于正在运行的作业,该时间戳将定期持续更新。还有负责运行作业的实例/进程/线程标识符。如果作业标记为正在运行,但更新丢失的时间间隔超过X个,则可以将前一个运行程序声明为失败,并且观察到此情况的下一个实例可以拥有此作业的所有权(更新所有者)


  • 如果整个cloudformation堆栈被“销毁”,这不会保护实例不被终止。如果父cloudformation堆栈被破坏,有一个“保留”ec2实例的策略,但是我找不到一个api来为给定实例翻转该位。
    aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --protected-from-scale-in