通过 Sentinel 将 Celery 连接到 Redis

Connecting Celery to Redis via Sentinel

如何告诉 celery 我在 redis 上寻找的服务名称?我正在尝试在 Celery 4 中使用内置的 Sentinel 支持。我正在传递一个代理 URL 配置,正如它在 the documentation 中所说: sentinel://0.0.0.0:26379

但是 redis 似乎抱怨没有被传递 service_name:

File "/usr/local/lib/python2.7/dist-packages/redis/sentinel.py", line 222, in discover_master
    raise MasterNotFoundError("No master found for %r" % (service_name,))
OperationalError: No master found for None

是否可以使用这种 URL 格式传递 service_name?我试过了

sentinel://0.0.0.0:26379/my_service
sentinel://0.0.0.0:26379/0/my_service

我没能找到关于连接 URLs 的任何文档——我找到了 redis-sentinel-URL 但我没有看到它包含在 redis 包中,所以我不是甚至确定它正在被 redis 使用。

我设法解决了这个问题:celery 需要同时设置 broker_urlbroker_transport_options 配置。

1) broker_url 采用哨兵形式 URL: sentinel://localhost:26379

2) broker_transport_options 是一个字典,需要您尝试连接的哨兵服务的名称。即,如果您想将作业推送到名为 'fiddlesticks' 的队列: {"master_name":"fiddlesticks"}

虽然上面的错误信息是在抱怨你传入错误的'service_name',但你实际上是想使用密钥'master_name'传入。