我有两个芹菜实例。我希望能够通过电子邮件,推送等方式通知所有用户特定事件。但是,我想确保所有用户仅收到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个工人。
答案 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,])
注意:我认为删除缓存可能没有必要。因为你只需要发送一次,直到它过期。