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?
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). –
@OferZelig merci, mais '@ quelqu'un' ne fonctionne pas, sauf si je suis déjà impliqué dans la publication; p –
@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! –