如何在 AWS 中后台具有可扩展性的 Django API?



我在Django(restframework(中有一个API,实际上托管在单个docker容器模板Web服务器的Elastic Beanstalk中,使用AWS EB提供的LoadBalancer和AutoScale。

我想后台 API,因为它在同一秒内处理许多请求命中,导致许多 5xx http 错误。经过一些研究,我发现 Celery 可以使用 SQS 为我完成这项工作,但我不知道如何开发这个场景(我可以在本地与 Celery worker 一起运行 API,但我不知道如何在 AWS EB 上甚至在 docker comose 中做到这一点(。

我应该使用 Elastic Beanstalk Worker 环境和/或 docker-compose? 我可以将 Django 和 Celery 放在 docker-compose 中并将其部署到 EB Web 上,或者在这种情况下我需要更改环境层吗?

我需要在我的实际项目(Docker-Django-EBWeb(中对后台任务进行什么样的更改?

注意:我需要容器映像中的一些配置来集成过去的Oracle 11g DB(即时客户端11g + cx-Oracle5.3(

我发现使用 beanstalk 解决此问题的唯一方法是使用多容器而不是单个容器。

我的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 映像推送到那里。

我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新