Django、Celery、SQS环境中Celery任务无法更新PostgreSQL数据库排查
问题:Celery任务无法更新AWS RDS PostgreSQL数据库对象
我尝试将蒙特卡洛(Monte Carlo)任务卸载到Celery执行,并将结果保存至AWS RDS PostgreSQL数据库。目前在views.py中已成功创建MonteCarloResultTrue对象,但tasks.py中的Celery任务无法更新该数据库对象。
views.py代码
newResults = MonteCarloResultTrue.objects.create(htmlCompanyArray = "[]") viewRun = runMonteCarloAsync.delay(checkedCompaniesIDs,newResults.id)
tasks.py代码
@app.task(bind=True) def runMonteCarloAsync(self,checkedCompaniesIDs, calc_id): newResults = MonteCarloResultTrue.objects.get(id=calc_id) newResults.htmlCompanyArray = "[asdf]" newResults.save()
当前settings.py的Celery配置
CELERY_accept_content = ['application/json'] CELERY_task_serializer = 'json' CELERY_TASK_DEFAULT_QUEUE = 'django-queue-dev' CELERY_BROKER_URL = 'sqs://{0}:{1}@'.format( urllib.parse.quote(AWS_ACCESS_KEY_ID, safe=''), urllib.parse.quote(AWS_SECRET_ACCESS_KEY, safe='') ) CELERY_BROKER_TRANSPORT_OPTIONS = { "region": "us-east-1", 'polling_interval': 20 } CELERY_RESULT_BACKEND = 'django-db' CELERY_CACHE_BACKEND = 'django-cache'
Procfile配置
web: python manage.py runserver celery_worker: celery -A rvm.settings.celery.app worker --loglevel=INFO celery_beat: celery
排查方向
- 数据库连接加载问题:Celery Worker进程需要正确读取Django的数据库配置(AWS RDS连接信息),确保Worker启动时加载了正确的settings模块,无路径拼写错误。
- 事务提交延迟:
views.py中创建对象后,若Django事务未即时提交,Celery任务执行时可能无法读取到该对象。可尝试在创建对象后手动调用transaction.commit(),或调整事务配置。 - Worker启动命令校验:检查Procfile中
celery_worker的-A参数路径是否正确,确认rvm.settings.celery.app是Celery App的实际位置。 - 数据库权限验证:确认Celery使用的AWS IAM角色或数据库用户拥有
MonteCarloResultTrue表的UPDATE权限。 - 日志排查:调高Celery Worker日志级别到DEBUG,查看是否存在数据库连接失败、对象找不到(
get(id=calc_id)报错)或保存操作异常的日志信息。
内容的提问来源于stack exchange,提问作者Daniel Johnson
相关产品推荐
相关产品推荐

