2012-12-14 32 views
1

使用Postgres的hstore作为芹菜经纪人有可能(和/或是否有效)?与芹菜一起使用Postgres hstore?

我受限制(缺少一些非常有说服力的理由)使用Postgres数据库。我有一个芹菜任务的Django应用程序。目前我正在使用标准的数据库支持,但芹菜文档强烈建议,除了非常小的任务队列之外,不要使用这种方法。当我遇到有关Postgres的hstore功能的一些信息时,我正在考虑安装redis,并建议它提供与redis等效的功能。

我还没有看到专门为芹菜使用hstore的任何内容,但是,如果它真的可以替代redis,这看起来很奇怪。在
https://github.com/celery/celery/blob/master/celery/backends/base.py
它看起来像基地芹菜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并将其用作芹菜后端的争论。

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

回答

2

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

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

全部hstore是数据库字段中的哈希映射。它非常有用,但它并不神奇,它不会将您从使用RDBMS进行消息队列的潜在挑战中解放出来。

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

+0

谢谢 - 我显然没有得到关于什么hstore的正确图片(希望我看到了“数据库字段中的哈希映射”这个词组,解释了这一切),或者芹菜如何使用redis进行排队这听起来好像它并不是真正通过关键值存储来获得,就像pubsub功能绑定在一起)。不确定PGQ,因为它似乎需要合作消费者,但我一定会检查出来。 – Adam

+0

@Adam你能链接到你正在阅读的地方吗?有一些不好的信息在浮动,我真的很想从源头上解决它。 –

+0

@Adam for publish/subscribe你可能想查看PostgreSQL的'LISTEN'和'NOTIFY' –