检测 EC2 实例何时关闭(Java SDK)

Posted

技术标签:

【中文标题】检测 EC2 实例何时关闭(Java SDK)【英文标题】:Detecting when an EC2 instance will be shutting down (Java SDK) 【发布时间】:2014-10-12 21:25:14 【问题描述】:

我在 AWS 支持论坛上发布了这个,但没有收到回复,所以希望你们有一个想法......

我们有一个自动扩展组,可以根据当前负载启动或终止实例。我希望能够在我当前的 EC2 实例上检测到它即将关闭并完成我的工作。

更详细地描述情况。我们有一个自动扩展组,每个实例从单个 SQS 读取内容。每个实例将运行多个线程,每个线程都从同一个 SQS 队列中读取数据并根据需要处理数据。

我需要知道这个实例什么时候将要关闭,这样我就可以停止新线程读取数据,并阻止关闭,直到剩余的数据处理完。

我不确定如何在 Java SDK 中执行此操作,并且我担心我的实例会在我的数据未得到正确处理的情况下被终止。

谢谢 李

【问题讨论】:

你看过Runtime.addShutdownHook吗? 我还没有真正看过任何东西,因为我根本不知道从哪里开始。关闭挂钩可能是可行的,但我怀疑我的运行过程需要很长时间(文档表明这是一件坏事)并且 aws 将在实例完成之前终止实例。我怀疑我需要来自 AWS 的通知,说明即将关闭,并且我告诉它等待。 嗯,您可能希望首先让关闭方法对相关实例执行“检查”,以查看它是否已准备好关闭。如果您有一个正在访问的数据库(例如 DynamoDB),您可以简单地通过为实例制作的特殊表传递触发器,否则您可以尝试在 2 个实例之间打开一个套接字以传达远程实例已完成.据我所知,执行的关机会执行关机所需的任何操作,因此我不知道一旦启动它会以任何方式中断或延迟它。卡住的程序只是在关机时终止。 如果它是一个 linux (Debain) 实例,您可以编写一个 shell 脚本,通过在其中设置陷阱,可以在终止前向您发送电子邮件,链接 ***.com/questions/25599500/… 【参考方案1】:

当它想要缩减时,AWS Auto Scaling 会在没有警告的情况下终止您的 EC2 实例。

没有办法让任何队列工作人员在终止之前耗尽。

如果您的工作人员正在以事务方式处理消息,并且您在成功处理消息之前不会从 SQS 中删除消息,那么这应该不是问题。实例终止时处理将停止,事务不会提交。该消息不会从 SQS 队列中删除,稍后可以由其他工作人员提取和处理。

它支持的唯一一种耗尽行为是从 ELB 中耗尽 HTTP 连接:"If connection draining is enabled for your load balancer, Auto Scaling waits for the in-flight requests to complete or for the maximum timeout to expire, whichever comes first, before terminating instances".

【讨论】:

以上是关于检测 EC2 实例何时关闭(Java SDK)的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 React Native 应用程序何时关闭(未暂停)?

检测系统警报视图何时出现/将关闭

检测 uib-popover 何时打开和关闭?

如何在 React Native 中检测键盘何时打开或关闭

检测阅读器何时关闭命名管道(FIFO)

如何检测应用程序何时在后台 Swift 中强制关闭 [重复]