Buscando una comprensión de ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish

Aug 17 2020

Me cuesta separar el IRedisClient.PublishMessagey IMessageQueueClient.Publishy me doy cuenta de que debo estar mezclando algo.

ServiceStack nos da la opción de escuchar transmisiones pub/sub como esta:

    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"));
    }

Se ve bien, sencillo. Pero, ¿y el productor?

Al mirar las clases disponibles, pensé que uno podría usar el IRedisClient.PublishMessage(string toChannel, string message)o IMessageQueueClient.Publish(string queueName, IMessage message).

redisClient.PublishMessage("Test", json);
// or:     
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));

En ambos casos, usted mismo especifica el nombre del canal. Este es el comportamiento que estoy viendo:

  • el suscriptor de arriba solo recibe el mensaje si uso IRedisClient.PublishMessage(string toChannel, string message)y nunca si usoIMessageQueueClient.Publish(string queueName, IMessage message)
  • Si publico usando IRedisClient.PublishMessage, esperaba que se llenara el canal "Prueba" (si lo veo con un navegador Redis), pero no es así. Nunca veo ningún rastro de la cola (digamos que no inicio la suscripción, pero los productores agregan mensajes)
  • Si publico usando IMessageQueueClient.Publish(string queueName, IMessage message), se crea el canal "Prueba" y los mensajes se conservan allí, pero nunca se abren/recuperan y eliminan.

Quiero entender la diferencia entre los dos. Miré el código fuente y leí todo lo que pude al respecto, pero no encontré ninguna documentación con respecto a IRedisClient.PublishMessage.

Respuestas

Ted Aug 17 2020 at 21:29

Mythz respondió esto en el foro de ServiceStack, aquí .

El escribe:

Estos clientes no deben usarse indistintamente, solo debe usar clientes ServiceStack MQ para enviar mensajes MQ o el contenedor de mensajes Message MQ.

La suscripción de redis es una API de bajo nivel para crear una suscripción de publicación/suscripción de Redis, una API de nivel superior más útil es el servidor de publicación/suscripción administrado que envuelve la suscripción de publicación/suscripción detrás de un subproceso administrado.

De cualquier manera, MQ Server solo está diseñado para procesar mensajes de clientes MQ, si va a implementar su propia implementación de mensajería, use sus propios mensajes y redis clientes, no los clientes MQ o la clase MQ Message.

y

No hay API de IRedisClient (y ServiceStack.Redis) para Redis Server, la API PublishMessage envía el comando redis PUBLISH. IRedisSubscription crea una suscripción a Redis Pub/Sub; consulte los documentos de Redis para obtener información sobre cómo funciona Redis Pub/Sub. La biblioteca ServiceStack.Redis y todas sus API son solo para Redis Server, no contiene ninguna API ServiceStack.Messaging MQ.

Así que solo use ServiceStack.Redis para su implementación de suscripción Redis Pub/Sub personalizada, es decir, no use ninguna API de ServiceStack.Messaging, que es solo para ServiceStack MQ.