【发布时间】:2014-08-22 01:57:50
【问题描述】:
我使用 Tomcat(基于 java)创建了一个 Autoscaled Elastic Beanstalk 应用程序来提供 Web 服务。
作为首次初始化的一部分,我必须将一些大文件从 S3 复制并解压缩到底层 EC2 实例(如果实例重新启动并且已经有数据文件,则不需要此步骤)。这一切都在 servlets init() 方法中完成,并且在非缩放环境中完美运行 - 但速度很慢 - 大约需要 30 分钟。
但是当我创建一个自动缩放的环境时,我发现了两个问题:
它实际上启动了三个 EC2 实例,即使没有对服务进行一次调用,我假设在监视第一个实例以启动它时它没有响应,因为它在 init() 方法中很忙,因此它启动另一个实例,依此类推。
这表明服务已准备就绪,即使它们正忙于 init() 方法并且尚未准备好接受请求。
当然,Elastic Beanstalk 应该等待第一个实例的 init() 方法完成BEFORE,它指示它已准备好,然后再将其监控为繁忙并考虑启动新实例。
然后我离开了二十分钟,因为没有活动,三个实例中的两个被停止了。所以我想好吧,我可以在第一次部署时解决这个问题预加载,因此它们将快速启动。但是我又看了一遍,发现这两个实例现在已经被终止,所以认为问题在于如果 EB 决定启动一个新实例,因为 instance1 真的很忙,那么会有一段时间 instance2 没有真正准备好但正在接受请求,因此用户请求可能成功也可能失败,具体取决于它们是重定向到 instance1(有效)还是 instance2(失败)。
我的假设是否正确,为什么 EB 不尊重 init() 方法,我该如何解决这个问题?
【问题讨论】:
标签: java tomcat amazon-web-services amazon-elastic-beanstalk autoscaling