2013-04-02 97 views
1

我有兩個芹菜實例。我希望能夠通過電子郵件,推送等方式通知特定事件的所有用戶。但是,我想確保所有用戶只會收到一次通知。是否有一個如何循環訪問用戶並保證每個用戶都被聯繫一次的例子?多個實例的Django芹菜問題

我的解決方案是簡單地將用戶標記爲已收到通知......但這樣做效率很低。並且可能存在用戶在標記被保存時得到通知的情況。

我試着閱讀關於這個如下:

http://docs.celeryproject.org/en/latest/userguide/routing.html

http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html

[編輯]

通過2個實例我的意思是1名工人在兩個EC2的,所以2名工人。

回答

0

你看過這個嗎? Ensuring a task is only executed one at a time

儘管我認爲你的方法很好,但是將它存儲到數據庫中的方式是slow,你應該將它緩存起來以便很快地放置它。作爲一個簡單的設置,您可以在發送電子郵件之前緩存電子郵件(散列)。如果緩存已經存在,則不要發送電子郵件。

所以這會是這樣的

from hashlib import md5 
from django.core.cache import cache 
from celery import task 

# 1 day because I expect that the whole email task finish within a day 
# But the same email may be send out if executed on the next day. 
LOCK_TIME = 24 * 60 * 60 

@task 
def notify_user(email): 
    uid = md5(email).hexdigest() 

    # This will return False if the uid already exists in the cache 
    if cache.add(uid, 'notified', LOCK_TIME): 
     send_mail("Subject", "Message", None, [email,]) 

NB:我想刪除可能沒有必要緩存。由於您只關心發送一次,直到過期。

+0

緩存不可靠嗎? – KVISH

+0

您只需確保服務器永不死亡。這可能是您將旗子存入數據庫的另一種方法的權衡 – Yeo