Elastic Beanstalk主机特定的应用程序配置

时间:2013-12-22 22:52:46

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

我有一个java web应用程序,我正试图重新考虑使用弹性beanstalk的做事方式。该应用程序将进行负载平衡,并且(目前)有2台主机,而不会带来任何自动缩放的优势。问题是节点之间存在轻微的配置差异,特别是对某些Web服务的身份验证是使用不同的凭据进行的,以便有效地将吞吐量加倍,因为每个帐户限制都有限制。

目前我的应用程序将配置与存档分开处理,因此在配置保留在相对静态的文件路径中的固定主机上相对简单,只需要部署war文件。

沿着弹性beanstalk路径走下去,我想我必须在可部署工件中包含所有配置选项,以及如何让应用程序加载相关的主机特定配置。我遇到的问题是决定在应用程序中加载哪个配置。我可以使用关于主机的物理方面,即有效加载相关配置的IP地址或实例ID;

/config-<InstanceID-1>.properties 
/config-<InstanceID-2>.properties

这种方法完全有缺陷,因为如果我在beanstalk中创建一个全新的环境,则需要我更新项目中的所有配置文件以反映新创建的Instance-id。

有没有人想出一个在beanstalk中这样做的好方法?

1 个答案:

答案 0 :(得分:1)

如果必须有两种不同类型的节点,那么您应该考虑应用程序的SOA架构。

创建两个环境environment-aenvironment-b。通过AWS Web控制台设置环境的所有属性,或者可以重用现有配置文件,只需为每个环境设置特定的配置文件名。

#environment-a
PARAM1 = config-environment-a.properties

#environment-b
PARAM1 = config-environment-b.properties  

您共享相同的代码库并使用-e修饰符推送到任一环境。

#push to environment-a
$ git aws.push -e environment-a

#push to environment-b
$ git aws.push -e environment-b

您还可以创建git别名以同时推送到两个环境: - )

现在,SOA方法的主要好处是您可以单独扩展和管理这些环境。它简单而优雅。

如果您想要更复杂和更不优雅,请使用简单的令牌分发服务。在每个环境初始化时,向Amazon SQS发送两条消息。每条消息都应包含配置名称。然后从SQS中提取这些消息,每个实例将从队列中获取一个消息。无论消息包含哪个配置名称,请使用该配置配置节点。 : - )

希望它有所帮助。

更新后 @vcetinick 评论

  

对于应该非常简单的事情,所有看起来仍然相当复杂。

这就是我建议单独环境的原因。您可以创建自己的注册服务,当节点出现时,它会向服务注册,然后获取配置参数。您在持久数据库中保留可用配置。如果节点死亡并且服务获得另一个注册请求,则注册服务可以快速检查已注册的所有节点(因为它们在注册期间都保留了它们的信息),并且如果任何节点没有响应,则其配置数据被重新分配给新节点。现在你手上有single point of failure: - )

同样,可能还有其他方法可以解决这个问题。