我有一组外部服务,我想以短间隔(约 30 秒)从 AWS 连续轮询这些服务。例如,我有一组 git repos,我想轮询这些存储库的更改以触发 ci 管道。
我的要求是:
- 我希望解决方案具有可扩展性(假设我想轮询数千个 git 存储库)。
- 我希望解决方案能够自我修复。因此,如果外部服务在短时间内没有轮询(由于某些故障),但短时间后轮询应该会再次开始,这是可以的。
- 我需要一些外部方法来删除和添加应该轮询的外部服务。
在 AWS 中实现此功能的经济高效的方法是什么?
我对解决方案的想法
显而易见的方法是启动一组 ec2 实例(可能每 100 个我想轮询的服务启动 1 个)并在它们之间分配服务。对于自我修复,一种方法是使用自动缩放组。
但要实现这一点,自动扩展中的每个实例都需要知道它负责哪些服务,这意味着每个实例都需要一个可以在重新启动时恢复的唯一 ID。从这里我读到过这不是一个好的做法。
答案1
你的实际用例是什么?你给出了一个监控 git repos 的示例,但如果你实际做的不是这个,解决方案可能会有所不同。
无服务器
这听起来像是使用 Lambda/无服务器计算的典型用例。这对您来说是一个选择吗?
推
从任何接收更改的人那里推送很多比轮询更有效(正如 MLu 所指出的;))。如果您的工作负载确实是监控 git 存储库(您给出了示例),当发生任何变化时,它们可以推送给您。如果您不拥有存储库,我不知道您是否可以这样做,但这绝对值得考虑。
通过其他机制(例如 lambda 或 EC2 实例)推送到 SQS 队列会很便宜而且可靠。
EC2 选项
如果你必须使用 EC2 实例,我可以想到几个选择
EC2 选项一
将所需检查推送到队列的发布者。由 CloudWatch Events 触发的小型 EC2 / Lambda
根据队列中的消息数量自动扩展的消费者组
这样做的缺点是成本。每 30 秒进行 5000 次检查,每天产生 1440 万条消息,SQS 费用为 5.36 美元。如果您将它们分批处理为 10 个组,则每天的费用为 50 美分。似乎在 t3a.nano 实例上运行自己的队列可能更便宜,但您必须设置和管理它。
EC2 选项二
与上述类似,但将所需的作业存储在 DynamoDB 中,并让服务器轮询作业。设置起来会更麻烦,基本上使用像队列一样的数据库。
EC2 选项三
您可以将要执行的检查存储在 S3 中,使用 lambda 监视对象/文件是否有修改。执行此操作时,lambda 会划分作业并更新工作器上的配置。
还有许多其他解决方案,可能比这些更好,但这只是一些没有经过太多思考的想法。
答案2
轻的核对者/发布者发送到队列和一堆消费者/工人正如@Tim 所建议的,这是正确的模式。
但是如果你的意图确实是从 GIT 触发 CI/CD,请考虑配置接收后钩子在存储库中 - 它将消耗更少的资源。
此外,大多数 GIT 仓库服务(如 GitHub、GitLab 或 Bitbucket)都会发布最新更改的提要、RSS 或类似内容。与其git something ...
每 30 秒检查数千个 git 仓库,不如通过单个 http 请求来获取来自 feed 的最新更改。
希望有帮助:)