2017-01-09 2 views
1

Nous avons des clés Redis avec un TTL donné auquel nous aimerions nous abonner et agir dès que le TTL arrive à expiration (un planificateur de tâches).Abonnements Redis keyspace notifications dans un environnement distribué utilisant ServiceStack

Cela fonctionne bien dans un environnement à hôte unique, et lorsque vous vous abonnez dans ServiceStack, à l'aide de son client Redis, à '[email protected]__:expired', ce service le sélectionne et prend des mesures. C'est fantastique ...

... jusqu'à ce que vous ayez configuré une topologie à haute disponibilité, avec plus d'une instance d'API dans ce cluster. Ensuite, chaque hôte semble prendre connaissance de ce message et potentiellement faire des choses avec lui. Je sais que les notifications d'espace de touches ne fonctionnent pas exactement de la même manière que les événements de pub/sub ou de couche de messagerie traditionnels, mais est-il possible d'effectuer une sorte d'acquittement sur ces types d'événements, de sorte que, à la fin de le jour, un seul hôte va continuer avec la tâche?

Sinon, existe-t-il un moyen de retarder la publication d'un message?

Merci!

Répondre

1

Ma compréhension de votre question: Vous avez besoin d'un événement basé unicast chaque fois qu'une clé a expiré.

Cette solution vous sera utile si la supposition ci-dessus est correcte. C'est une sorte de solution brute mais ça marche!

Solution: D'une certaine façon, vous avez à faire usage de Redis Liste/file d'attente et en quelque sorte mettre les clés expirées dans la liste des Redis. Puis bloquer opération B * POP sur cette liste vous donnera ce que vous voulez!

Comment ça marche? Supposons qu'un thread d'arrière-plan unique pousse continuellement les clés expirées dans une liste/queue redis. Le cluster d'instances API appellera le blocage de pop sur cette liste/file d'attente. Puisque, le blocage de l'opération pop sur chaque élément de la liste redis sera consommé par un seul client, une seule instance de l'API recevra la notification de la clé expirée !!!

Ref:

opération pop Liste: https://redis.io/commands/lpop

problème similaire avec pub/sous: Competing Consumer on Redis Pub/Sub supported?