1

我有两个芹菜实例。我希望能够通过电子邮件、推送等通知特定事件的所有用户。但是,我想确保所有用户只收到一次通知。有没有一个如何循环访问用户并保证每个用户被联系一次的例子?

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

我试图阅读以下内容:

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

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

[编辑]

2 个实例是指两个 EC2 上的 1 个工作人员,所以 2 个工作人员。

4

1 回答 1

0

你读过这个吗?确保一个任务一次只执行一个

尽管我认为您的方法很好,但是将其存储为数据库是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,])

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

于 2013-05-06T17:29:24.663 回答