检测 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)的主要内容,如果未能解决你的问题,请参考以下文章