2010-11-09 3 views

Répondre

1

Vous pouvez travailler avec un anneau de plusieurs listes qui ont une composante de temps en leur nom. En tant que composant de temps, vous pouvez prendre la seconde en cours (0-59).

Vous ajoutez toujours des tâches à la liste pour la seconde en cours. Pour obtenir les travaux que vous faites un BLPOP (avec un délai d'expiration faible) uniquement sur les listes où il est garanti, que le contenu est plus ancien que le nombre de secondes donné.

Si vous travaillez à partir de plusieurs hôtes, vous devez veiller à ce que les horloges soient synchronisées (NTP).

15

Si vous voulez faire la planification avec Redis, je suggère d'utiliser ensemble triés (le z *) commande:

http://code.google.com/p/redis/wiki/SortedSets

ce que vous pouvez faire est quelque chose comme ceci:

ZADD jobs <unix timestamp of when you want the job to run> <job identifier> 

par exemple:

ZADD jobs 1291348355 

Ensuite, chaque si souvent (jusqu'à chaque seconde d) vous pouvez tirer les tâches planifiées devraient fonctionner (ou aurait dû exécuter maintenant):

ZRANGEBYSCORE jobs -inf, <current unix timestamp> 

Boom, vous avez vos travaux à exécuter. Bien sûr, assurez-vous de supprimer les tâches terminées de l'ensemble trié.

+0

Cool, mais j'aimerais obtenir la sémantique BLPOP. C'est-à-dire, j'ai besoin de ma requête à Redis pour bloquer jusqu'à ce que j'ai quelque chose à exécuter. Une seconde granularité n'est pas très robuste. –

+1

êtes-vous plus de planification ou faites-vous la queue? Je suppose que cela dépend de la précision de ce que vous travaillez. Quand je pense à la planification d'emplois, je pense en termes de «en 2 heures» ou «toutes les heures à l'heure», etc. Je ne vois pas la précision d'ordonnancement d'une sous-seconde problème dans ce cas d'utilisation. Les files d'attente/arrière-plans ressemblent plus à ce que vous recherchez, c'est-à-dire: "Je veux placer les tâches en arrière-plan et préparer les employés dès qu'ils sont placés dans la file d'attente." Dans ce cas, BLPOP fait beaucoup de sens. J'utilise des méthodes comme celle-ci lors du traitement en arrière-plan de données en continu (contenu twitter, par exemple). – efalcao

+2

Oh, vieux fil mais - Alexander - vous pouvez utiliser un thread de répartiteur qui vérifie les ensembles triés toutes les N secondes et déplace simplement les travaux de l'ensemble trié à la liste des tâches principale pendant que les travailleurs principaux sont en attente. –

1

Bien que la réponse de @ efalcao soit très bonne, votre question pourrait indiquer que redis répond parfaitement aux besoins de votre application. si votre application a la nature d'une boîte de messagerie, veuillez utiliser rabbitMQ qui comporte des messages retardés ou akka si vous vous sentez en gras