Recherche d'une compréhension de ServiceStack.Redis : IRedisClient.PublishMessage vs IMessageQueueClient.Publish
J'ai du mal à séparer le IRedisClient.PublishMessage
et IMessageQueueClient.Publish
et je me rends compte que je dois mélanger quelque chose.
ServiceStack nous donne la possibilité d'écouter les diffusions pub/sub comme celle-ci :
static IRedisSubscription _subscription;
static IRedisClient redisClientSub;
static int received = 0;
static void ReadFromQueue()
{
redisClientSub = redisClientManager.GetClient();
_subscription = redisClientSub.CreateSubscription();
_subscription.OnMessage = (channel, msg) =>
{
try
{
received++;
}
catch (Exception ex)
{
}
};
Task.Run(() => _subscription.SubscribeToChannels("Test"));
}
Ça a l'air sympa, simple. Mais qu'en est-il du producteur ?
En regardant les classes disponibles, j'ai pensé que l'on pouvait soit utiliser le IRedisClient.PublishMessage(string toChannel, string message)
ou IMessageQueueClient.Publish(string queueName, IMessage message)
.
redisClient.PublishMessage("Test", json);
// or:
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));
Dans les deux cas, vous spécifiez vous-même le nom du canal. Voici le comportement que je constate :
- l'abonné ci-dessus ne reçoit le message que si j'utilise
IRedisClient.PublishMessage(string toChannel, string message)
et jamais si j'utiliseIMessageQueueClient.Publish(string queueName, IMessage message)
- Si je publie en utilisant
IRedisClient.PublishMessage
, je m'attendais à ce que le canal "Test" soit rempli (si je visualise avec un navigateur Redis), mais ce n'est pas le cas. Je ne vois jamais aucune trace de la file d'attente (disons que je ne démarre pas l'abonnement, mais que les producteurs ajoutent des messages) - Si je publie en utilisant
IMessageQueueClient.Publish(string queueName, IMessage message)
, le canal "Test" est créé et les messages y sont conservés, mais jamais extraits/récupérés et supprimés.
Je veux comprendre la différence entre les deux. J'ai regardé le code source et lu tout ce que je peux à ce sujet, mais je n'ai trouvé aucune documentation concernant IRedisClient.PublishMessage
.
Réponses
Mythz y a répondu sur le forum ServiceStack, ici .
Il écrit:
Ces clients ne doivent pas être utilisés de manière interchangeable, vous ne devez utiliser que les clients ServiceStack MQ pour envoyer des messages MQ ou le wrapper Message MQ Message.
L'abonnement redis est une API de bas niveau pour créer un abonnement Redis Pub/Sub, une API de niveau supérieur plus utile est le serveur Pub/Sub géré qui encapsule l'abonnement pub/sub derrière un thread géré.
Quoi qu'il en soit, MQ Server est uniquement conçu pour traiter les messages des clients MQ. Si vous envisagez d'implémenter votre propre implémentation de messagerie, utilisez vos propres messages et clients Redis, et non les clients MQ ou la classe MQ Message.
et
Aucune API IRedisClient (& ServiceStack.Redis) n'est pour Redis Server, l'API PublishMessage envoie la commande redis PUBLISH. IRedisSubscription crée un abonnement Redis Pub/Sub, consultez la documentation Redis pour savoir comment fonctionne Redis Pub/Sub. La bibliothèque ServiceStack.Redis et toutes ses API sont uniquement destinées au serveur Redis, elle ne contient aucune API ServiceStack.Messaging MQ.
Utilisez simplement ServiceStack.Redis pour votre implémentation d'abonnement Redis Pub/Sub personnalisée, c'est-à-dire n'utilisez aucune API ServiceStack.Messaging qui est réservée à ServiceStack MQ.