我正在EC2现场实例上运行一些应用程序.这些情况可能会被亚马逊杀死,恕不另行通知.
在关闭过程中,进程按某种顺序被终止.我们有监控/恢复程序,根据服务器是关闭还是进程崩溃,应该采取不同的行为. (具体来说,如果服务器实际关闭,我们不想做任何事情)
如何在恢复过程中检测到(如果它仍然存在)由于关闭而导致进程被终止?
(更多系统细节:我在一个不修改外部状态的沙箱中运行未知/不可信/等代码.通常,如果沙盒代码崩溃,则是不受信任代码的作者的错误,我们不会重新运行它.但是如果由于VM故障或失败,沙盒代码终止,我们需要在另一个实例上重新运行.我现在遇到的问题是用户的代码首先被终止,因此监控程序错误地认为崩溃是用户错误.)
解决方法
代理人
在生成沙箱子进程的每台计算机上运行代理.代理运行“防崩溃”代码,沙箱代码运行可能崩溃的用户代码.
负责使用新沙箱进程启动新计算机的监视系统会检查哪些进程已被终止(代理程序和沙箱进程或仅沙箱子进程).
它通过打开TCP连接(RMI / RPC / HTTP)到代理查询其子进程来实现.
如果代理响应 – 计算机仍在运行,则可以询问其子沙箱进程.
如果代理没有响应 – 机器被怀疑被终止.
代理人(变异)
代理还负责在同一VM上重新启动子沙箱进程,以防它崩溃.
查找服务
使用查找服务(例如Zoo Keeper)来跟踪发送心跳保持活动的进程.如果代理处于活动状态,则计算机仍在运行,如果代理程序未处于活动状态,则表示该计算机未运行.
ec2 api
轮询EC2 API以确定机器是处于运行状态还是已终止状态.