Django Celery有多个实例的问题

时间:2013-04-02 16:44:18

标签: django celery

我有两个芹菜实例。我希望能够通过电子邮件,推送等方式通知所有用户特定事件。但是,我想确保所有用户仅收到ONCE通知。是否有一个如何循环访问用户和gaurantee每个用户联系一次的例子?

我的解决方案是简单地将用户标记为已收到通知......但这样效率非常低。并且可能存在这样的情况:用户在保存标记之间得到通知。

我试着阅读以下内容:

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

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

[编辑]

在2个实例中,我指的是两个EC2的1个工人,所以2个工人。

1 个答案:

答案 0 :(得分: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,])

注意:我认为删除缓存可能没有必要。因为你只需要发送一次,直到它过期。