在 Heroku 上托管应用程序时,我经常通过代码中的 Heroku API 触发一次性 dynos,以在后台执行繁重的工作。我最近在 AWS 上设置了一些堆栈,并通过使用 AWS ECS 运行任务遵循了类似的模式。
我没有为此使用长时间运行的队列工作程序,因为硬件资源根据特定任务而有很大差异,并且通常工作负载出现在高峰期。
对于本地开发,我通常通过在正在运行的容器中执行后台任务或从控制台手动触发后台命令来跳过这个主题。什么是在本地运行一次性容器的好方法?
在 Heroku 上托管应用程序时,我经常通过代码中的 Heroku API 触发一次性 dynos,以在后台执行繁重的工作。我最近在 AWS 上设置了一些堆栈,并通过使用 AWS ECS 运行任务遵循了类似的模式。
我没有为此使用长时间运行的队列工作程序,因为硬件资源根据特定任务而有很大差异,并且通常工作负载出现在高峰期。
对于本地开发,我通常通过在正在运行的容器中执行后台任务或从控制台手动触发后台命令来跳过这个主题。什么是在本地运行一次性容器的好方法?
您可以简单地从容器内部调用 ECS RunTask API调用。
您只需要设置 ECS 任务角色以拥有 runtask 权限,并在容器中拥有 aws cli 或任何 aws sdk 来调用 runtask 调用。
您可以将 docker 套接字作为卷传递
volumes:
- /var/run/docker.sock:/var/run/docker.sock
之后,您可以在容器内运行 docker 命令,它们将由主机上的 docker 执行。
特别是你可以运行
docker run ...
或者
docker start ...
(可能你必须通过命令在你的容器中安装 docker Dockerfile
)
ECS 支持计划任务,如果您知道计划高峰的时间,您可以使用计划任务按计划启动 Fargate 容器。
如果您不这样做,我们所做的是编写一个小型 API Gateway -> Lambda 函数,该函数基本上动态启动 Fargate 容器,其中包含在 POST 中定义的一些变量到 API Gateway 端点,如 CPU/Mem/port 等...或 pre -创建任务定义并将任务定义传递给api,如果您知道容器的大部分“设置”应该是什么,这是另一种选择。