Phi*_*lip 5 cron amazon-web-services
我有一个(golang Web 服务器)服务在 EC2 上的 AWS 上运行(无自动缩放)。该服务有一些全天运行的 cron 作业,这些作业在服务启动时启动。
我想在 AWS 上以某种形式利用自动缩放功能。一直在关注 ECS 和 Beanstalk。
当我添加自动缩放时,由于外部 API 的速率限制,我需要 cron 作业仅在缩放的服务之一上执行。现在,cron 作业与服务紧密耦合,我正在寻找一种不需要将 cron 作业移动到其自己的服务的选项。
如何使用 AWS 以良好的方式实现这一目标?
在任何可扩展应用程序中,cron 不能/不应该运行多次,您都会遇到这个问题。这并不是 AWS 特有的。我不确定您希望在多大程度上保持耦合或您的 cron 当前如何运行,但这里有一些可能对您有用的建议:
创建一个“cron runner”实例,并限制运行 crons
您可以创建一个单独的 ECS 服务,该服务没有自动扩展且固定值为 1 个实例。该实例将运行与“正常”实例相同的代码副本,并运行 crons。您可以在“正常”实例上关闭 crons。您可能会发现这可能是一个非常小的实例,因为它不处理任何网络流量。
创建一个远程触发 cron 的“cron 触发器”实例
在这里,您创建一个“触发”实例,该实例通过 ALB 向普通实例发送请求。因为您的 ALB 会将请求路由到其后面的一台服务器,所以 cron 只会运行一次。需要注意的是,如果您的 cron 长时间运行,您可能需要考虑请求超时。您还必须考虑重试等问题,但我假设您已经有了一个可以适应这一点的流程。
上述解决方案可以通过消息队列等进行调整,但两者的基础是存在另一种启动 cron 并与普通服务器分开的实例。根据您的 cron 运行时间,您可能只需要每天运行此 cron 实例几个小时,因此执行此类操作非常经济高效。
就我个人而言,我在多租户应用程序中使用了这两种方法,并且由于租户的数量以及同时为所有租户运行 cron 所需的时间/资源,我不得不选择像这样运行 cron 的选项:
这还可以帮助处理 SQS 中管理的重试策略和死信队列的故障。
最终你需要从一个地方启动这些 cron。如果可能的话,更改你的 crons,这样即使它们运行两次也没关系。它使处理重试之类的事情变得更容易。
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |