[英]What is the best Way to run a CronJob in containerized django application with 2 or more Replicas
我正在開發一個項目,該項目作為具有 3 個副本的服務部署在 docker swarm 上。 如果日期已過,我想運行一個簡單的管理命令從表中刪除一些行。 我已經為它編寫了一個 django 命令,但想使用 cron 作業使運行自動化。 我確實想確保作業每天僅從屬於我的服務的任何容器運行一次。 在互聯網上,我發現了一些為 Django 應用程序運行 cron 作業而構建的包,但沒有一個包考慮多個容器。 一些包有基於鎖的方法,但它是基於文件的鎖而不是共享鎖。 我不想芹菜為這個簡單的任務。
以下是我的命令的一瞥:
class Command(BaseCommand):
"""Command to clear user subscription if end_date has passed"""
def handle(self, *args, **options):
try:
deleted_count, relative_deleted = MyModel.delete_inactive_instances()
except Exception:
raise CommandError('Could Not Remove Inactive Subscriptions From DB')
else:
self.stdout.write(self.style.SUCCESS('Successfully Removed Inactive Subscriptions %s ' % deleted_count))
我目前每天通過 docker exec 運行一個命令:
python manage.py delete_inactive_instances
以下是我的 docker-stack 文件:
services:
production_app:
image: {id}.dkr.ecr.{region}.amazonaws.com/xxxxxx:latest
expose:
- 8000
deploy:
replicas: 2
command: >
sh -c "python manage.py migrate && gunicorn app.wsgi:application --workers 3 --bind 0.0.0.0:8000"
env_file:
- .prod.env
nginx:
image: {id}.dkr.ecr.{region}.amazonaws.com/nginx:latest
ports:
- 80:80
您可以使用 Celery 和 Celery Beat 調度程序。 它與 Django 完美集成。 在您的 docker swarm 配置中,您將添加以下服務:
如果你不想為你的 swarm 添加額外的服務,你也可以在你的 django 容器中運行 celery worker 作為后台任務。 節拍調度器是控制任務何時運行的調度器,但它們實際上是由芹菜工人執行的
您可以在此項目中找到使用 docker compose 配置的工作設置示例: https : //github.com/testdrivenio/django-celery-beat
作為替代方案,您可以在堆棧配置中使用相同的圖像但不同的入口點定義一個附加服務:該服務將只負責運行由入口點定義的 cron 任務
您可以使用 Celery 和 Celery Beat 調度程序。 它與 Django 完美集成。 在您的 docker swarm 配置中,您將添加以下服務:
如果你不想為你的 swarm 添加額外的服務,你也可以在你的 django 容器中運行 celery worker 作為后台任務。 但是,您應該只運行節拍調度程序的一個實例以防止任務重復。 節拍調度器是控制任務何時運行的調度器,但它們實際上是由芹菜工人執行的。
您可以在此處找到 docker compose 配置示例: https : //github.com/testdrivenio/django-celery-beat
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.