带 Django、Celery 和 CloudAMPQ 的 Heroku - 超时错误
Heroku with Django, Celery and CloudAMPQ - timeout error
我正在按照“Django 3 实例”一书中的第 7 章建立一个在线商店。这本书的作者是Antonio Melé。
在我的本地机器上一切正常。当我将它部署到 Heroku 时它也运行良好。
但是,当我尝试使用 Celery 和 RabbitMQ(CloudAMQP、Little Lemur、Heroku 上)时,工作人员应该发送给客户的电子邮件没有发送。该任务需要超过 30 秒然后崩溃:
heroku[router]: at=error code=H12 desc="Request timeout" method=POST
我创建了一个 tasks.py 文件,用于发送电子邮件。我的 settings.py 文件包含以下 Celery 行:
broker_url = os.environ.get('CLOUDAMQP_URL')
broker_pool_limit = 1
broker_heartbeat = None
broker_connection_timeout = 30
result_backend = None
event_queue_expires = 60
worker_prefetch_multiplier = 1
worker_concurrency = 50
这取自https://www.cloudamqp.com/docs/celery.html
而我的Procfile如下,
web: gunicorn shop.wsgi --log-file -
worker: celery worker --app=tasks.app
我是不是漏掉了什么?
谢谢!
虽然不是您的技术堆栈,但对 heroku 非常熟悉。所以一般处理heroku超时的方法是这样的:
首先,确定导致超时的确切原因。一件或多件事情花费了很多时间。
现在您有 3 个主要选项。
- Heroku Scheduler(或其他几个类似插件之一)。如果您可以通过终端命令 运行 某种脚本非常有用,并且 10 minutes/1 hour/24 小时检查脚本是否需要 运行 就足够了为你。我通常认为这是最直接的解决方案,但它并不总是可以接受的。根据您发送电子邮件的内容,电子邮件延迟 5-15 分钟可能是可以接受的。
- 后台进程工作者。看起来这就是你想用 Celery 做的,但它配置不正确,可能帮不上什么忙。
- 优化。 heroku 设置 30 秒超时的原因是因为一般来说,用户等待 30 秒等待响应确实没有充分的理由。我很想知道为什么发送一封电子邮件需要 30 多秒,除非您需要发送几百封电子邮件或者电子邮件非常非常大。或者,您可能在发送电子邮件之前做了很多工作,尽管这提出了一个问题,即为什么不将这些工作与发送电子邮件命令分开。我怀疑在尝试设置后台进程工作人员之前,您应该先了解一下原因。
在尝试解决这个问题几天后,我通过 CLOUDAMQP
联系了支持部门
他们帮我弄清楚这个问题与 Celery 没有正确识别我的 BROKER_URL 有关。
然后我看到了 @jainal09 here 的这个不错的评论。应该在 settings.py
:
中设置一个额外的变量
CELERY_BROKER_URL = '<broker address given by Heroku config>'
添加那条额外的线解决了问题。现在 Heroku 可以正确发送邮件了。
我正在按照“Django 3 实例”一书中的第 7 章建立一个在线商店。这本书的作者是Antonio Melé。
在我的本地机器上一切正常。当我将它部署到 Heroku 时它也运行良好。
但是,当我尝试使用 Celery 和 RabbitMQ(CloudAMQP、Little Lemur、Heroku 上)时,工作人员应该发送给客户的电子邮件没有发送。该任务需要超过 30 秒然后崩溃:
heroku[router]: at=error code=H12 desc="Request timeout" method=POST
我创建了一个 tasks.py 文件,用于发送电子邮件。我的 settings.py 文件包含以下 Celery 行:
broker_url = os.environ.get('CLOUDAMQP_URL')
broker_pool_limit = 1
broker_heartbeat = None
broker_connection_timeout = 30
result_backend = None
event_queue_expires = 60
worker_prefetch_multiplier = 1
worker_concurrency = 50
这取自https://www.cloudamqp.com/docs/celery.html
而我的Procfile如下,
web: gunicorn shop.wsgi --log-file -
worker: celery worker --app=tasks.app
我是不是漏掉了什么?
谢谢!
虽然不是您的技术堆栈,但对 heroku 非常熟悉。所以一般处理heroku超时的方法是这样的:
首先,确定导致超时的确切原因。一件或多件事情花费了很多时间。
现在您有 3 个主要选项。
- Heroku Scheduler(或其他几个类似插件之一)。如果您可以通过终端命令 运行 某种脚本非常有用,并且 10 minutes/1 hour/24 小时检查脚本是否需要 运行 就足够了为你。我通常认为这是最直接的解决方案,但它并不总是可以接受的。根据您发送电子邮件的内容,电子邮件延迟 5-15 分钟可能是可以接受的。
- 后台进程工作者。看起来这就是你想用 Celery 做的,但它配置不正确,可能帮不上什么忙。
- 优化。 heroku 设置 30 秒超时的原因是因为一般来说,用户等待 30 秒等待响应确实没有充分的理由。我很想知道为什么发送一封电子邮件需要 30 多秒,除非您需要发送几百封电子邮件或者电子邮件非常非常大。或者,您可能在发送电子邮件之前做了很多工作,尽管这提出了一个问题,即为什么不将这些工作与发送电子邮件命令分开。我怀疑在尝试设置后台进程工作人员之前,您应该先了解一下原因。
在尝试解决这个问题几天后,我通过 CLOUDAMQP
联系了支持部门他们帮我弄清楚这个问题与 Celery 没有正确识别我的 BROKER_URL 有关。
然后我看到了 @jainal09 here 的这个不错的评论。应该在 settings.py
:
CELERY_BROKER_URL = '<broker address given by Heroku config>'
添加那条额外的线解决了问题。现在 Heroku 可以正确发送邮件了。