我有一个java web应用程序,我正试图重新考虑使用弹性beanstalk的做事方式。该应用程序将进行负载平衡,并且(目前)有2台主机,而不会带来任何自动缩放的优势。问题是节点之间存在轻微的配置差异,特别是对某些Web服务的身份验证是使用不同的凭据进行的,以便有效地将吞吐量加倍,因为每个帐户限制都有限制。
目前我的应用程序将配置与存档分开处理,因此在配置保留在相对静态的文件路径中的固定主机上相对简单,只需要部署war文件。
沿着弹性beanstalk路径走下去,我想我必须在可部署工件中包含所有配置选项,以及如何让应用程序加载相关的主机特定配置。我遇到的问题是决定在应用程序中加载哪个配置。我可以使用关于主机的物理方面,即有效加载相关配置的IP地址或实例ID;
/config-<InstanceID-1>.properties
/config-<InstanceID-2>.properties
这种方法完全有缺陷,因为如果我在beanstalk中创建一个全新的环境,则需要我更新项目中的所有配置文件以反映新创建的Instance-id。
有没有人想出一个在beanstalk中这样做的好方法?
答案 0 :(得分:1)
如果必须有两种不同类型的节点,那么您应该考虑应用程序的SOA架构。
创建两个环境environment-a
和environment-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: - )
同样,可能还有其他方法可以解决这个问题。