我的配置
Celery - 4.3.0
Python - 3.7.1
Django - 2
Broker - Redis
OS - Windows 10
我正在使用芹菜约6-7个月,这真是太神奇了。
今天,我遇到了一个奇怪的问题。
我已将Redis
设置为我的消息代理。
因此,当我没有对 bind 和 authentication 进行限制时,即默认为不进行身份验证的localhost,一切正常。
但是当我对 bind 和 authentication 配置施加一些限制时,即localhost更改为我的网络IP,并通过密码启用了身份验证,并由celery初始化为
app = Celery('app_name',
backend='redis',
broker='redis://'
+ lib.get_conf('redis_db_user')
+ ':'
+ lib.get_conf('redis_db_password')
+ '@'
+ lib.get_conf('redis_db_host')
+ ':'
+ str(lib.get_conf('redis_db_port')))
我从yaml文件加载此配置:
#REDIS Database
redis_db_host: "192.168.1.236"
redis_db_user: ""
redis_db_password: "pass123"
redis_db_name: "1"
redis_db_port: 6379
通过上述配置,我的芹菜可以完美地与所有工人一起运转。我的一些工作人员分布在网络中,因此我无法使用localhost配置。
TL; DR
现在,我的大部分任务是按celery-beat计划的,我的某些任务是通过调用delay()
方法从此计划的任务中调用的。现在这里发生了错误!!!
my_task.delay(param1,..)
在调用时不遵循当前的芹菜配置,而是尝试使用默认本地主机配置调用redis。
kombu.exceptions.OperationalError: Error 10061 connecting to localhost:6379. No connection could be made because the target machine actively refused it.
现在这也发生在Django的视图中。
我尝试过的事情-
1。在settings.py
CELERY_RESULT_BACKEND = 'redis'
CELERY_BROKER_URL = 'redis://' \
+ lib.get_conf('redis_db_user')\
+ ':'\
+ lib.get_conf('redis_db_password')\
+ '@'\
+ lib.get_conf('redis_db_host')\
+ ':'\
+ str(lib.get_conf('redis_db_port'))
2。寻找其他替代方案
就像尝试过my_task.s(param1,..).apply_async()
3。阅读芹菜的文档
我从这里读过https://docs.celeryproject.org/en/latest/userguide/calling.html
4。老学校
重新启动一切;)
但是所有解决方案都不适合我:(
我要在生产环境中部署应用程序,并且需要 bind 和 身份验证配置