2012-04-09 1 views
7

J'utilise un canal Redis pubsub pour envoyer des messages d'un pool de processus de travail à mon application ASP.NET. Lorsqu'un message est reçu, mon application transmet le message au navigateur d'un client avec SignalR.Maintenir un abonnement Redis PubSub ouvert avec Booksleeve

J'ai trouvé this solution pour maintenir une connexion ouverte à Redis, mais elle ne tient pas compte des abonnements lorsqu'elle recrée la connexion.

Je me occupe actuellement Redis messages PubSub dans mon fichier Global.asax:

public class Application : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     var gateway = Resolve<RedisConnectionGateway>(); 
     var connection = gateway.GetConnection(); 
     var channel = connection.GetOpenSubscriberChannel(); 

     channel.PatternSubscribe("workers:job-done:*", OnExecutionCompleted); 
    } 

    /// <summary> 
    /// Handle messages received from workers through Redis.</summary> 
    private static void OnExecutionCompleted(string key, byte[] message) 
    { 
     /* forwarded the response to the client that requested it */ 
    } 
} 

Le problème se produit lorsque le RedisConnection courant est fermé pour une raison quelconque. La solution la plus simple est de déclencher un événement de la classe RedisConnectionGateway lorsque la connexion a été réinitialisée et de vous réabonner en utilisant un nouveau RedisSubscriberChannel. Cependant, tous les messages publiés sur le canal pendant la réinitialisation de la connexion seront perdus.

Existe-t-il des exemples de méthodes recommandées pour gérer cette situation?

+0

Ma solution renvoie en effet une connexion Redis si elle est déjà ouverte, ou en ouvre une si ce n'est pas le cas. Je crois que dans "l'utilisation conventionnelle" la connexion restera ouverte et vous ne l'obtiendrez pas dans votre schéma PubSub. Dans les rares cas où la connexion est fermée pour une raison quelconque, vous en obtiendrez une nouvelle, et oui - les messages publiés sur le canal pendant la réinitialisation de la connexion seront perdus. Mais c'est pour très peu de temps, et cela ne devrait pas arriver de façon régulière. Quoi qu'il en soit, mettons l'accent sur l'auteur de BookSleeve (CC @marcgravell). –

+0

@OferZelig merci, mais '@ quelqu'un' ne fonctionne pas, sauf si je suis déjà impliqué dans la publication; p –

+0

@MarcGravell Je ne le savais pas; de toute façon: 1) Comment peut-on communiquer avec un autre utilisateur SE pour attirer son attention sur quelque chose? Je veux dire - à l'intérieur d'un site SE, pas en vérifiant son profil et aller à son blog ou autre; 2) Vous pouvez implémenter dans SE une fonctionnalité qui identifie ceci et des alertes (un modèle xxx, où xxx est un nom d'utilisateur SE connu). Merci! –

Répondre

7

Oui, si la connexion est interrompue (instabilité du réseau, re-mastering, etc.), vous devrez ré-appliquer les abonnements que vous avez effectués. Un événement pour se reconnecter et se réabonner est assez normal, et pas très différent de ce que nous utilisons ici sur SE/SO (sauf que nous suivons généralement des abonnements plus granulaires, et avons du code wrapper qui gère tout cela).

Oui, tous les événements publiés lorsque votre connexion a été rompue ont disparu. C'est la nature de redis pub/sub; il ne garantit pas la livraison aux clients déconnectés. Utilisez pour le faire, ou utilisez redis pour piloter une file d'attente. t le laisser tomber après l'avoir sorti de la liste). Si cela aide, j'ai sur ma liste une demande pour ajouter les méthodes pop bloquantes - elles détruisent totalement l'intention du multiplexeur, mais elles ont une utilisation réelle dans certains cas, donc je ne suis pas contre leur ajout.

+0

Je ne verrais pas d'inconvénient à voir les méthodes pop bloquantes ajoutées à l'API. À l'heure actuelle, mon projet Web utilise Booksleeve, mais les travailleurs qui traitent mon application Web dépendent de ServiceStack.Redis pour l'API pop bloquante. –

+1

@Justin il doit être ajouté - j'espère que cette semaine –

+0

Ce serait génial! Merci! –

Questions connexes