使用 S3 存储应用程序配置文件
Using S3 to store application configuration files
我正在创建一个简单的 Web 应用程序,需要将其部署到 AWS 中的多个区域。该应用程序需要一些由单独服务管理的动态配置。当通过此服务更改配置时,我需要将这些更改传播到所有区域的所有 Web 应用程序实例。
我考虑过使用 DynamoDB 的跨区域复制来执行此操作,但我不想在每个区域和复制控制台中承担 运行 DynamoDB 的额外成本。然后我想到了使用本质上是跨区域的 S3。
基本上,配置服务会将所有配置作为静态 JSON 文件写入 S3。每个 Web 应用程序实例将定期检查 S3 以查看自上次检查以来是否有任何配置文件发生更改,并在必要时下载新配置。配置更改对时间不敏感,因此每 5/10 分钟轮询一次更改就足够了。
你们之前是否使用过类似的方法来管理应用程序配置?您认为这是一个明智的解决方案,或者您有更好的建议吗?
此配置的正确工具取决于配置的大小和您需要的粒度。
您可以在一个区域同时使用 DynamoDB 和 S3 来为所有区域的应用程序提供服务。您可以从所有区域读取 S3 中的配置文件,也可以从所有区域读取单个 DynamoDB table 中的配置记录。由于地球的距离,会有一些延迟,但对于读取配置来说,这应该不是什么大问题。
如果每次加载配置时都需要整套配置,使用 S3 可能更有意义。但是,如果您需要按应用程序的不同部分以及在不同的时间和计划读取大型配置的一小部分,则将其存储在 DynamoDB 中更有意义。
在这两个选项中,配置成本都很低,因为 S3 中文本文件的成本和一些访问该文件的成本应该几乎是免费的。在 DynamoDB 中预期同样的低成本,因为您可能只有几 KB 的数据并且每秒读取的次数非常低(每秒 5 次读取容量绰绰有余)。即使您决定将数据复制到所有区域,它仍然几乎是免费的。
我编写了一个应用程序,它完全按照您建议的方式工作,而且效果非常好。正如所指出的,S3 不是 'inherently cross-region',但它天生就具有跨多个可用性区域的持久性,结合跨区域复制应该绰绰有余。
在我的例子中,我的应用程序对配置更改也不是时间敏感的,但是 none-除了定期进行应用程序轮询之外(在我的例子中每小时或之后 1 次)每个 long-运行 作业),我还让每个应用程序订阅了 SNS 端点,这样当 S3 上的配置文件发生变化时,会引发 SNS 事件并通知应用程序发生了变化 - 所以在某些情况下应用程序立即获得配置更改,但如果出于某种原因它们无法立即处理 SNS 事件,它们将 'catch up' 在每个小时的顶部,当服务器重新启动时 and/or 在最坏的情况下通过每 60 分钟轮询一次 S3 更改。
我正在创建一个简单的 Web 应用程序,需要将其部署到 AWS 中的多个区域。该应用程序需要一些由单独服务管理的动态配置。当通过此服务更改配置时,我需要将这些更改传播到所有区域的所有 Web 应用程序实例。
我考虑过使用 DynamoDB 的跨区域复制来执行此操作,但我不想在每个区域和复制控制台中承担 运行 DynamoDB 的额外成本。然后我想到了使用本质上是跨区域的 S3。
基本上,配置服务会将所有配置作为静态 JSON 文件写入 S3。每个 Web 应用程序实例将定期检查 S3 以查看自上次检查以来是否有任何配置文件发生更改,并在必要时下载新配置。配置更改对时间不敏感,因此每 5/10 分钟轮询一次更改就足够了。
你们之前是否使用过类似的方法来管理应用程序配置?您认为这是一个明智的解决方案,或者您有更好的建议吗?
此配置的正确工具取决于配置的大小和您需要的粒度。
您可以在一个区域同时使用 DynamoDB 和 S3 来为所有区域的应用程序提供服务。您可以从所有区域读取 S3 中的配置文件,也可以从所有区域读取单个 DynamoDB table 中的配置记录。由于地球的距离,会有一些延迟,但对于读取配置来说,这应该不是什么大问题。
如果每次加载配置时都需要整套配置,使用 S3 可能更有意义。但是,如果您需要按应用程序的不同部分以及在不同的时间和计划读取大型配置的一小部分,则将其存储在 DynamoDB 中更有意义。
在这两个选项中,配置成本都很低,因为 S3 中文本文件的成本和一些访问该文件的成本应该几乎是免费的。在 DynamoDB 中预期同样的低成本,因为您可能只有几 KB 的数据并且每秒读取的次数非常低(每秒 5 次读取容量绰绰有余)。即使您决定将数据复制到所有区域,它仍然几乎是免费的。
我编写了一个应用程序,它完全按照您建议的方式工作,而且效果非常好。正如所指出的,S3 不是 'inherently cross-region',但它天生就具有跨多个可用性区域的持久性,结合跨区域复制应该绰绰有余。
在我的例子中,我的应用程序对配置更改也不是时间敏感的,但是 none-除了定期进行应用程序轮询之外(在我的例子中每小时或之后 1 次)每个 long-运行 作业),我还让每个应用程序订阅了 SNS 端点,这样当 S3 上的配置文件发生变化时,会引发 SNS 事件并通知应用程序发生了变化 - 所以在某些情况下应用程序立即获得配置更改,但如果出于某种原因它们无法立即处理 SNS 事件,它们将 'catch up' 在每个小时的顶部,当服务器重新启动时 and/or 在最坏的情况下通过每 60 分钟轮询一次 S3 更改。