2013-04-02 3 views
1

J'ai deux instances de Céleri. Je veux être en mesure d'informer tous les utilisateurs d'un événement particulier par e-mail, push, etc. Cependant, je veux m'assurer que tous les utilisateurs ne sont notifiés qu'une seule fois. Existe-t-il un exemple de comment faire la boucle entre les utilisateurs et garantir que chaque utilisateur est contacté une fois?Problème Django Céleri avec plusieurs instances

La solution que j'ai est de simplement marquer l'utilisateur comme ayant reçu une notification ... Mais ce serait très inefficace. Et il peut y avoir une condition où l'utilisateur est notifié entre la marque est en cours d'enregistrement.

J'ai essayé de lire ce qui suit à ce sujet:

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

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

[EDIT]

Par 2 cas je veux dire 1 travailleur sur deux années EC2, donc 2 travailleurs .

Répondre

0

Avez-vous lu celui-ci? Ensuring a task is only executed one at a time

Bien que je pense que votre approche est bonne, mais en stockant une base de données est slow, vous devriez le mettre en cache pour mettre très rapidement. Comme une configuration simple, vous pouvez mettre en cache l'email (hashed) avant d'envoyer l'email. Si le cache existe déjà, n'envoyez pas l'e-mail.

Donc, ce serait quelque chose comme

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: Je pense que La suppression du cache ne peut pas nécessaire. Puisque vous vous souciez seulement d'envoyer une fois jusqu'à ce qu'il expire.

+0

Le cache n'est-il pas fiable? – KVISH

+0

Vous devez juste vous assurer que le serveur n'est jamais mort. C'est probablement le compromis d'une autre de vos approches qui stockent le drapeau dans la base de données. – Yeo

Questions connexes