2012-12-14 29 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' –