是否有人将 django celery worker 实现为 docker 容器,它仅在分配任务时运行
Is anyone implemented django celery worker as docker container it only runs when task assigned
我能够使用 FARGATE 作为计算,将 Django Celery worker 作为 docker 容器成功部署到 AWS ECS 服务中。
但我担心的是芹菜容器 运行ning 24/7。如果我可以 运行 容器仅在分配任务时,我可以根据 AWS FARGATE 计费方法节省很多钱。
您是否考虑过使用 AWS Lambda 而不是 celery worker?然后,您将按任务执行付费,其中成本由执行时间和内存使用情况决定。如果您有一个大部分空闲的应用程序,那么按请求付费,跳过空闲成本,将是最有意义的。
Celery 并不是真正适合使用的东西,因为它旨在坚持,但目标应该相当容易实现。
在架构上,您可能想要 运行 Fargate 任务上的脚本。该脚本通过队列咀嚼然后死亡。您会以某种方式触发该任务:
- 来自您的数据接收器(例如 Django)的 API 调用
- 一个 lambda 函数(由什么触发?)
还有一些悬而未决的问题...您是将自己限制在一次完成一项任务,还是需要管理对队列的并发请求?你重试吗?但是一个合理的起点。
一种不推荐但可能更简单的方法是 运行 Django 容器中的 celery worker(例如使用主管)并使用 Fargate 的自动缩放功能。你总是有一个 Django 容器 运行 接收数据。如果该容器上的 celery worker 用完了所有可用资源,Fargate 将通过添加任务来扩展服务。一旦工作完成,它就会移除多余的容器。您将为每个容器中的 Django 支付 "overhead",但它可能比始终在线的 celery 容器花费更少,而且肯定会更简单——利用您的 celery 经验并避免额外的事件处理层。
编辑:此版本的另一个缺点是您需要在某处 运行 Redis,我发现这样做的最低成本相对较高。
根据我不断增长的 AWS 经验,您可能应该这样做...
- 使用 AWS API Gateway as an always-on receiver of events/requests. You only pay for requests, the free tier includes a million per month, and the next 300M are (pricing) 所以这很可能是免费的。
- 虽然您有许多响应请求的选项,但 AWS Lambda 函数(可以用 python 编写)应该具有最少的开销。
- 如果您的队列 运行 比 Lambda 函数允许的时间长(15 分钟),您需要让 Lambda 函数将处理委托给例如Fargate 任务。
- (可选)如果您想为 Fargate 任务使用 Dockerhub 容器,我们遇到了一系列问题,任务和服务由于 Dockerhub 的速率限制而无法启动。我们最终将我们的 Fargate 任务包装在一个 Step Function 中,专门检查了这个错误并重试了。
- (可选)如果您需要限制并发,this SO answer 建议让您的 Lambda 函数检查现有执行(Step Function 或 Fargate 任务)。我希望 Fargate Tasks 或 Step Functions 上有原生的东西,但我什么也没看到。
我想这将比永远在线的 Fargate 任务和 Elasticache Redis 队列节省大量运营成本,但前期 cost/hassle 可能会超过节省的成本。
我能够使用 FARGATE 作为计算,将 Django Celery worker 作为 docker 容器成功部署到 AWS ECS 服务中。
但我担心的是芹菜容器 运行ning 24/7。如果我可以 运行 容器仅在分配任务时,我可以根据 AWS FARGATE 计费方法节省很多钱。
您是否考虑过使用 AWS Lambda 而不是 celery worker?然后,您将按任务执行付费,其中成本由执行时间和内存使用情况决定。如果您有一个大部分空闲的应用程序,那么按请求付费,跳过空闲成本,将是最有意义的。
Celery 并不是真正适合使用的东西,因为它旨在坚持,但目标应该相当容易实现。
在架构上,您可能想要 运行 Fargate 任务上的脚本。该脚本通过队列咀嚼然后死亡。您会以某种方式触发该任务:
- 来自您的数据接收器(例如 Django)的 API 调用
- 一个 lambda 函数(由什么触发?)
还有一些悬而未决的问题...您是将自己限制在一次完成一项任务,还是需要管理对队列的并发请求?你重试吗?但是一个合理的起点。
一种不推荐但可能更简单的方法是 运行 Django 容器中的 celery worker(例如使用主管)并使用 Fargate 的自动缩放功能。你总是有一个 Django 容器 运行 接收数据。如果该容器上的 celery worker 用完了所有可用资源,Fargate 将通过添加任务来扩展服务。一旦工作完成,它就会移除多余的容器。您将为每个容器中的 Django 支付 "overhead",但它可能比始终在线的 celery 容器花费更少,而且肯定会更简单——利用您的 celery 经验并避免额外的事件处理层。
编辑:此版本的另一个缺点是您需要在某处 运行 Redis,我发现这样做的最低成本相对较高。
根据我不断增长的 AWS 经验,您可能应该这样做...
- 使用 AWS API Gateway as an always-on receiver of events/requests. You only pay for requests, the free tier includes a million per month, and the next 300M are (pricing) 所以这很可能是免费的。
- 虽然您有许多响应请求的选项,但 AWS Lambda 函数(可以用 python 编写)应该具有最少的开销。
- 如果您的队列 运行 比 Lambda 函数允许的时间长(15 分钟),您需要让 Lambda 函数将处理委托给例如Fargate 任务。
- (可选)如果您想为 Fargate 任务使用 Dockerhub 容器,我们遇到了一系列问题,任务和服务由于 Dockerhub 的速率限制而无法启动。我们最终将我们的 Fargate 任务包装在一个 Step Function 中,专门检查了这个错误并重试了。
- (可选)如果您需要限制并发,this SO answer 建议让您的 Lambda 函数检查现有执行(Step Function 或 Fargate 任务)。我希望 Fargate Tasks 或 Step Functions 上有原生的东西,但我什么也没看到。
我想这将比永远在线的 Fargate 任务和 Elasticache Redis 队列节省大量运营成本,但前期 cost/hassle 可能会超过节省的成本。