如何在 AWS 中为 Django API 提供可扩展性?
How to background Django API with scalability in AWS?
我在 Django (restframework) 中有一个 API 实际上托管在 Elastic Beanstalk 中的单个 docker 容器模板 Web 服务器中,使用 AWS EB 提供的 LoadBalancer 和 AutoScale。
我想在后台 API 因为它处理同一秒内的许多请求命中,导致许多 5xx http 错误。经过一些研究,我发现 Celery 可以使用 SQS 为我完成这项工作,但我不知道如何开发这种情况(我可以 运行 API 与本地的 Celery worker,但我不知道我不知道如何在 AWS EB 甚至 docker-compose 中实现。
我应该使用 Elastic Beanstalk Worker 环境 and/or docker-compose 吗?
我可以将 Django 和 Celery 放在 docker-compose 中并将其部署在 EB Web 上,还是在这种情况下我需要更改环境层?
我需要在我的实际项目(Docker-Django-EBWeb)中对后台任务做什么样的改变?
注意:我需要容器镜像中的一些配置来集成过去的 Oracle 11g 数据库(即时客户端 11g + cx-Oracle5.3)
我发现使用 beantalk 解决这个问题的唯一方法是使用多容器而不是单个容器。
我的Dockerrun.aws.json有点像
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "staticfiles",
"host": {
"sourcePath": "/var/app/current/staticfiles"
}
},
{
"name": "nginx-proxy-conf",
"host": {
"sourcePath": "/var/app/current/proxy/conf.d"
}
},
{
"name": "app-sock",
"host": {
"sourcePath": "/tmp/run"
}
}
],
"containerDefinitions": [
{
"name": "api",
"image": "REPOSITORY_URL",
"essential": true,
"memoryReservation": 256,
"command": [
"/app/entrypoint-api.sh"
],
"portMappings": [
{
"hostPort": 8000,
"containerPort": 8000
}
],
"mountPoints": [
{
"sourceVolume": "staticfiles",
"containerPath": "/var/app/current/staticfiles"
},
{
"sourceVolume": "app-sock",
"containerPath": "/tmp/run/"
}
]
},
{
"name": "celery",
"image": "REPOSITORY_URL",
"essential": true,
"memory": 256,
"memoryReservation": 128,
"command": [
"/app/entrypoint-celery.sh"
],
"links": [
"api"
]
},
{
"name": "nginx-proxy",
"image": "nginx",
"essential": true,
"memory": 128,
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"mountPoints": [
{
"sourceVolume": "staticfiles",
"containerPath": "/var/app/current/staticfiles",
"readOnly": true
},
{
"sourceVolume": "awseb-logs-nginx-proxy",
"containerPath": "/var/log/nginx"
},
{
"sourceVolume": "nginx-proxy-conf",
"containerPath": "/etc/nginx/conf.d"
},
{
"sourceVolume": "app-sock",
"containerPath": "/tmp/run/"
}
]
}
]
}
/app/entrypoint-api.sh
就像:
#!/bin/sh
cd /app
python manage.py migrate
python manage.py collectstatic --no-input
/usr/local/bin/gunicorn --chdir /app project_name.wsgi --bind unix:/tmp/run/project_name.sock
而 /app/entrypoint-celery.sh
就像:
#!/bin/sh
cd /app
celery -A project_name worker -l info
我有这个 运行 完全没有问题,缺点是您需要使用 ECR 并将 Docker 图像推送到那里。
希望对您有所帮助。
我在 Django (restframework) 中有一个 API 实际上托管在 Elastic Beanstalk 中的单个 docker 容器模板 Web 服务器中,使用 AWS EB 提供的 LoadBalancer 和 AutoScale。
我想在后台 API 因为它处理同一秒内的许多请求命中,导致许多 5xx http 错误。经过一些研究,我发现 Celery 可以使用 SQS 为我完成这项工作,但我不知道如何开发这种情况(我可以 运行 API 与本地的 Celery worker,但我不知道我不知道如何在 AWS EB 甚至 docker-compose 中实现。
我应该使用 Elastic Beanstalk Worker 环境 and/or docker-compose 吗? 我可以将 Django 和 Celery 放在 docker-compose 中并将其部署在 EB Web 上,还是在这种情况下我需要更改环境层?
我需要在我的实际项目(Docker-Django-EBWeb)中对后台任务做什么样的改变?
注意:我需要容器镜像中的一些配置来集成过去的 Oracle 11g 数据库(即时客户端 11g + cx-Oracle5.3)
我发现使用 beantalk 解决这个问题的唯一方法是使用多容器而不是单个容器。
我的Dockerrun.aws.json有点像
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "staticfiles",
"host": {
"sourcePath": "/var/app/current/staticfiles"
}
},
{
"name": "nginx-proxy-conf",
"host": {
"sourcePath": "/var/app/current/proxy/conf.d"
}
},
{
"name": "app-sock",
"host": {
"sourcePath": "/tmp/run"
}
}
],
"containerDefinitions": [
{
"name": "api",
"image": "REPOSITORY_URL",
"essential": true,
"memoryReservation": 256,
"command": [
"/app/entrypoint-api.sh"
],
"portMappings": [
{
"hostPort": 8000,
"containerPort": 8000
}
],
"mountPoints": [
{
"sourceVolume": "staticfiles",
"containerPath": "/var/app/current/staticfiles"
},
{
"sourceVolume": "app-sock",
"containerPath": "/tmp/run/"
}
]
},
{
"name": "celery",
"image": "REPOSITORY_URL",
"essential": true,
"memory": 256,
"memoryReservation": 128,
"command": [
"/app/entrypoint-celery.sh"
],
"links": [
"api"
]
},
{
"name": "nginx-proxy",
"image": "nginx",
"essential": true,
"memory": 128,
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"mountPoints": [
{
"sourceVolume": "staticfiles",
"containerPath": "/var/app/current/staticfiles",
"readOnly": true
},
{
"sourceVolume": "awseb-logs-nginx-proxy",
"containerPath": "/var/log/nginx"
},
{
"sourceVolume": "nginx-proxy-conf",
"containerPath": "/etc/nginx/conf.d"
},
{
"sourceVolume": "app-sock",
"containerPath": "/tmp/run/"
}
]
}
]
}
/app/entrypoint-api.sh
就像:
#!/bin/sh
cd /app
python manage.py migrate
python manage.py collectstatic --no-input
/usr/local/bin/gunicorn --chdir /app project_name.wsgi --bind unix:/tmp/run/project_name.sock
而 /app/entrypoint-celery.sh
就像:
#!/bin/sh
cd /app
celery -A project_name worker -l info
我有这个 运行 完全没有问题,缺点是您需要使用 ECR 并将 Docker 图像推送到那里。
希望对您有所帮助。