用django+celery配置MemCachier,需要输入用户名和密码吗?

Configuring MemCachier with django+celery, do I input username and password?

Celery 配置包括 CELERY_RESULT_BACKEND 对 memcached 的支持。来自 the documentation 的例子是:

CELERY_RESULT_BACKEND = 'cache+memcached://127.0.0.1:11211/'

我目前正在尝试配置 celery 以将 memcahed 与我的 MemCachier 缓存一起使用,因此我将其配置如下:

CELERY_RESULT_BACKEND = 'cache+memcached://mc5.dev.ec2.memcachier.com:11211'

其中 mc5.dev.ec2.memcachier.com:11211 是我缓存的 url:port。

问题是,现在当 celery 尝试使用缓存来存储结果时,我收到 invalid username or password 错误:

12:04:29 worker.1 | ClientError: error 9 from memcached_set: (0x2f2a520) invalid username or password,  host: mc5.dev.ec2.memcachier.com:11211

我找不到任何包含 memcached 用户名和密码的 celery 后端配置示例,但我尝试将其格式化为:

CELERY_RESULT_BACKEND = 'cache+memcached://<user>:<password>@mc5.dev.ec2.memcachier.com:11211'

并以这个错误结束:

ValueError: invalid literal for int() with base 10: '<password>@mc5.dev.ec2.memcachier.com'

这似乎表明 url 没有被正确解析。有人知道配置芹菜以使用用户名和密码使用 MemCachier 的正确方法吗?

首先,celery 缓存后端将与 pylibmcmemcache 模块一起使用,具体取决于可用的模块。您需要确保使用 pylibmc,因为这是 MemCachier 所支持的。

其次,MemCachier 似乎没有记录身份验证方案。您可能应该阅读 pylibmc 的源代码以了解它是如何处理这个问题的。

我认为您必须通过子类 celery.backends.cache.CacheBackend 来添加身份验证支持。

我终于搞清楚了。诀窍不是通过需要身份验证的 CELERY_RESULT_BACKEND 创建对缓存的新引用,而是使用对您的(已经过身份验证的)django 缓存后端的引用。

换句话说,一旦你开始工作:

In [1]: from django.core.cache import cache

In [2]: cache.set('foo', 'bar')
Out[2]: True

In [3]: cache.get('foo')
Out[3]: 'bar'

celery 后端可以像这样配置使用缓存:

CELERY_RESULT_BACKEND = 'djcelery.backends.cache:CacheBackend'