繁体   English   中英

AWS 中的自动扩展服务,无需重复 cron 作业

[英]Auto scaling service in AWS without duplicating cron jobs

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

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

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

如何使用 AWS 以一种好的方式实现这一目标?

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

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

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

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

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


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

就我个人而言,我在多租户应用程序中使用了这两种方法,我不得不 go 选择像这样运行 cron,因为租户的数量和一次为所有租户运行 cron 所需的时间/资源:

  • Cloudwatch 计划触发 lambda 向 SQS 发送消息,以分别为每个租户排队 cron。
  • Cron 服务器(与主要的 web 服务器完全分开,但运行相同/相似的代码)提取消息并为每个租户单独运行 cron。 在 redis 中为 cron 存储一个密钥,这对于仅运行一次以停止“至少一次”交付问题至关重要,因此 cron 不会运行两次。

这也有助于处理 SQS 中管理的重试策略和死信队列的故障。

最终,您需要从一个地方启动这些 crons。 如果可能,请更改您的 crons,这样它们是否运行两次都没关系。 它使处理重试和类似的事情变得更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM