在Elastic Beanstalk中,Auto Scaling无法与Tomcat一起正常工作

时间:2014-07-01 13:23:48

标签: java tomcat amazon-web-services elastic-beanstalk autoscaling

我使用Tomcat(基于java)创建了一个Autoscaled Elastic Beanstalk应用程序来提供Web服务。

作为首次初始化的一部分,我必须将一些大型文件从S3复制并解压缩到底层EC2实例(如果重新启动实例并且已经有数据文件,则不需要此步骤)。这一切都在servlets init()方法中完成,并且在非缩放环境中完美运行 - 但速度很慢 - 大约需要30分钟。

但是当我创建一个自动缩放的环境时,我发现了两个问题:

  1. 它实际上启动了三个EC2实例,即使没有对服务进行单一调用,我假设在监视第一个实例启动时它没有响应,因为它在init()方法中忙碌而且因此它开始了另一个实例,依此类推。

  2. 它表示服务已准备就绪,即使他们忙于init()方法而尚未准备好接受请求。

  3. 当然Elastic Beanstalk应该等待第一个实例的init()方法完成 BEFORE 它表示已准备就绪,然后才将其监视为忙,并考虑启动新实例。

    然后我离开它20分钟,因为没有活动,然后停止了三个实例中的两个。所以我认为我可以在第一次部署时解决这个问题我可以等待一段时间它会自行解决,然后当服务器真正忙碌时我已经准备好了额外的两个实例来处理数据预装,所以他们会很快开始。但我再次看了一下,发现这两个实例现已终止,所以认为问题是如果EB决定启动一个新实例,因为instance1真的很忙,那么将会有一段时间,其中instance2还没有真正准备好但是正在接受请求,因此用户请求可能成功或可能失败,具体取决于它们是重定向到instance1(works)还是instance2(失败)。

    我的假设是否正确,为什么EB不尊重init()方法以及如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

Elastic Beanstalk通常不了解应用程序服务器内部,包括servlet上下文侦听器。 Beanstalk将对您的环境资源进行运行状况检查,如果您的实例没有响应,则可以根据您的自动扩展配置替换它们。这可能是您看到更多实例没有流量的原因。

Elastic Beanstalk执行的应用程序运行状况监视在此处描述:

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.healthstatus.html

使用.config文件设置实例可能比上下文侦听器init()更好,请参阅:

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.customami.html