gpt4 book ai didi

amazon-web-services - AWS 中的自动缩放服务,无需复制 cron 作业

转载 作者:行者123 更新时间:2023-12-04 14:09:09 25 4
gpt4 key购买 nike

我有一个(golang 网络服务器)服务在 EC2 上的 AWS 上运行(无自动缩放)。该服务有几个全天运行的 cron 作业,这些作业在服务启动时启动。

我想在 AWS 上以某种形式利用 Auto Scaling。一直在关注 ECS 和 Beanstalk。

当我添加自动缩放时,由于外部 API 的速率限制,我需要 cron 作业仅在其中一项缩放服务上执行。现在,cron 作业在服务中紧密耦合,我正在寻找不需要将 cron 作业移动到它自己的服务的选项。

如何使用 AWS 以良好的方式实现这一点?

最佳答案

在 crons 不能/不应该多次运行的任何可扩展应用程序中,您都会遇到这个问题作为一个普遍问题。它并不是特定于 AWS 的。我不确定您希望在多大程度上保持耦合或您的 cron 当前如何运行,但这里有一些可能对您有用的建议:

创建一个限制运行 crons 的“cron runner”实例

您可以创建一个单独的 ECS 服务,它没有自动缩放和 1 个实例的固定值。此实例将运行与“正常”实例相同的代码副本,并将运行 crons。你会在你的“正常”实例上关闭 crons。您可能会发现这可能是一个非常小的实例,因为它不处理任何网络流量。

创建一个远程触发 crons 的“cron 触发器”实例

在这里您创建一个“触发器”实例,它通过 ALB 向您的普通实例发送请求。因为您的 ALB 会将请求路由到它后面的其中一台服务器,所以 cron 只运行一次。需要注意的一点是,如果您的 cron 长时间运行,您可能需要考虑您的请求超时。您还必须考虑重试等问题,但我假设您已经有一个可以适应该问题的流程。


上述解决方案可以适应消息队列等,但两者的基础是有另一个启动 cron 的实例,并且与您的普通服务器分开。根据您的 cron 运行时间,您可能只需要每天运行此 cron 实例几个小时,这样执行此类操作会更具成本效益。

就我个人而言,我在 Multi-Tenancy 应用程序中使用了这两种方法,由于租户的数量以及为所有租户运行 cron 所花费的时间/资源,我不得不选择像这样运行 cron立刻:

  • Cloudwatch 计划会触发一个 lambda,该 lambda 会向 SQS 发送一条消息,以便为每个租户分别对 cron 进行排队。
  • Cron 服务器(完全独立于主要网络服务器但运行相同/相似的代码)拉取消息并为每个租户单独运行 cron。在 redis 中为 crons 存储一个 key ,这对于只运行一次以解决“至少一次”交付问题至关重要,这样 crons 就不会运行两次。

这还可以帮助处理在 SQS 中管理的重试策略和死信队列的故障。

最终,您需要从一个地方启动这些 cron。如果可能,请更改您的 cron,这样即使它们运行两次也没关系。它可以更轻松地处理重试和类似的事情。

关于amazon-web-services - AWS 中的自动缩放服务,无需复制 cron 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65859011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com