gpt4 book ai didi

java - 当 aws autoscaling 组成员被销毁并且有未完成的 Spring 异步线程在做事情时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 08:02:47 26 4
gpt4 key购买 nike

我有一个 Spring 应用程序,它今天使用 @Async 方法来处理一些非必要但信息丰富的内容。效果很好。

我想将一些新的处理移动到应用程序的这个角落,但我不完全理解如果通过 AWS 关闭它正在运行的 ec2 实例会发生什么。

此应用作为自动缩放组的一部分在 AWS 中的 Tomcat 8 上运行。我们部署频繁,扩展和缩减很多,所以机器终止是例行公事。我知道这可能会导致某些线程在中途停止,这是可以接受的。

现有用例:“通过 Slack 向中层管理人员报告过去一小时的销售情况。”

我知道机器关闭可能会导致 Slack 消息无法发布,这没关系。这只是中层管理人员。

新用例:“每天凌晨 5:00 通过电子邮件向高级管理人员报告最后一天的销售情况。”

如果此报告需要很长时间才能运行,则运行它的线程很可能会在电源线被拔掉时停止。

我知道如何防止这种情况并通过 Redis 等使事情“有点原子”,但这不会扩展到连续失败或任务持续时间最终超过 ec2 生命周期时,我想更深入地了解如何ec2 实例“关闭”命令会影响当前正在通过 @Async 方法调用运行代码的运行中的 jvm 线程。

我不想在 Lambda 或任何其他带外运行这些东西,因为我们的域在这个代码库中并且经常更新。

我在谷歌上搜索了一下这个主题,几乎所有结果都产生了他们的应用程序容器的主题not在这种情况下关闭,这与我正在寻找的信息相反。

谢谢!

-尼尔

最佳答案

这里有两点需要注意:

  1. 直接回答您的问题:

    What happens when an aws autoscaling group member is destroyed and there are outstanding Spring async threads doing stuff?

    线程获取 InterruptedException。

  2. 您描述的场景并不真正适合 Auto-scaling 实例。这些是为处理交通而设计的。您的场景更多是关于作业处理。专用(也许是预定的)实例(队列)更适合这种情况。如果您需要运行其中的许多实例,您可以安排 Spot 实例以降低成本。如果您通常在流量处理机器上运行作业,这听起来像是您在应用程序中混合关注点,最好将它们分开。

  3. 在该实例中,我将运行为作业执行一些状态管理的应用程序。您可以自己编写,使用像 DynamoDB 这样的持久存储(Elasticache 很好,但如果失败了怎么办?),或者让其他一些工具为您完成(例如 Oozie、Chronos/Airflow,具体取决于您的首选语言)。

    如果自己实现,每个报告间隔(比如说一天)都会有一个记录。状态机将是:Not Running(与不存在相同)、RunningFailedDone。除了 Not Running 之外的所有内容都将具有上次更新时间戳,该时间戳将针对正在运行的作业定期持续更新。还有谁拥有正在运行的作业的实例/进程/线程标识符。如果该作业被标记为正在运行但更新丢失超过 X 间隔,您可以将前一个运行器声明为失败,并且观察到此的下一个实例可以取得该作业的所有权(更新所有者)。

关于java - 当 aws autoscaling 组成员被销毁并且有未完成的 Spring 异步线程在做事情时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36640132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com