1

是否可以(和/或有效)使用 Postgres 的 hstore 作为 celery 的代理?

我被限制(没有一些非常令人信服的理由)使用 Postgres 数据库。我有一个带有芹菜任务的 django 应用程序。目前我正在使用标准数据库支持,但 celery 文档强烈建议不要使用这种方法来处理非常小的任务队列之外的任何事情。当我遇到一些关于 Postgres 的 hstore 功能的信息以及它提供与 redis 等效功能的建议时,我正在考虑安装 redis。

不过,我还没有看到任何关于将 hstore 专门用于 celery 的信息,如果它真的可以替代 redis,这似乎很奇怪。查看
https://github.com/celery/celery/blob/master/celery/backends/base.py
上的 celery 后端代码, 看起来基本的 celery KeyValueStoreBackend 是一个非常简单的 api:

def get(self, key):
    raise NotImplementedError('Must implement the get method.')

def mget(self, keys):
    raise NotImplementedError('Does not support get_many')

def set(self, key, value):
    raise NotImplementedError('Must implement the set method.')

def delete(self, key):
    raise NotImplementedError('Must implement the delete method')

def incr(self, key):
    raise NotImplementedError('Does not implement incr')

但在我可能花大量时间在这之前,似乎值得问一下我是否遗漏了一些反对使用 hstore 实现这个 API 并将其用作 celery 后端的东西。

例如。celery 是否具有此 API 未捕获的要求(例如原子性、可伸缩性、负载下的可靠性)?使用 hstore 实现这一点会不会对现有的数据库后端提供实质性的改进?我对芹菜相当陌生,从未使用过 hstore,所以我不确定我忽略了什么(如果有的话)。

4

1 回答 1

2

hstore绝对不提供“与 redis 等效的功能”。

字段不是字段中的hstore键值数据库。试图以这种方式使用它会导致痛苦和糟糕的表现。每次更新都必须重写包含该字段的整个记录​​。此外,与关系数据库中的任务队列相同的挑战也适用于,这意味着您最多可以获得单个工作人员的性能,即使表面上看起来像您一样,您也不会获得并发性。hstorehstore

All hstoreis 是数据库字段中的哈希映射。它非常有用,但并不神奇,它不会让您摆脱使用 RDBMS 进行消息队列的潜在挑战。

如果需要消息队列,请使用消息队列。PGQ是一个不错的选择。或者查看 ZeroMQ 等专用消息队列工具。

于 2012-12-14T00:54:53.873 回答