Buscando uma compreensão do ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish

Aug 17 2020

Estou tendo dificuldade em separar o IRedisClient.PublishMessagee IMessageQueueClient.Publishe percebo que devo estar misturando alguma coisa.

O ServiceStack nos dá a opção de ouvir transmissões de 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"));
    }

Parece bom, direto. Mas e o produtor?

Ao olhar para as classes disponíveis, pensei que alguém poderia usar o 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));

Em ambos os casos, você mesmo especifica o nome do canal. Este é o comportamento que estou vendo:

  • o assinante acima só recebe a mensagem se eu usar IRedisClient.PublishMessage(string toChannel, string message)e nunca se eu usarIMessageQueueClient.Publish(string queueName, IMessage message)
  • Se eu publicar usando IRedisClient.PublishMessage, esperava que o canal "Test" fosse preenchido (se eu visualizar com um navegador Redis), mas não é. Nunca vejo nenhum rastro da fila (digamos que não inicie a assinatura, mas os produtores adicionam mensagens)
  • Se eu publicar usando IMessageQueueClient.Publish(string queueName, IMessage message), o canal "Teste" será criado e as mensagens serão mantidas lá, mas nunca exibidas/buscadas e excluídas.

Quero entender a diferença entre os dois. Examinei o código-fonte e li tudo o que pude sobre ele, mas não encontrei nenhuma documentação sobre IRedisClient.PublishMessage.

Respostas

Ted Aug 17 2020 at 21:29

Mythz respondeu isso no fórum ServiceStack, aqui .

Ele escreve:

Esses clientes não devem ser usados ​​de forma intercambiável, você só deve usar os clientes ServiceStack MQ para enviar mensagens MQ ou o wrapper Message MQ Message.

A assinatura redis é uma API de baixo nível para criar uma assinatura Redis Pub/Sub, uma API de nível superior mais útil é o Managed Pub/Sub Server, que envolve a assinatura pub/sub por trás de um thread gerenciado.

De qualquer forma, o MQ Server é projetado apenas para processar mensagens de clientes MQ, se você for implementar sua própria implementação de mensagens, use suas próprias mensagens e clientes redis, não os clientes MQ ou a classe MQ Message.

e

Nenhuma API IRedisClient (& ServiceStack.Redis) é para Redis Server, a API PublishMessage envia o comando redis PUBLISH. IRedisSubscription cria uma assinatura do Redis Pub/Sub, consulte a documentação do Redis para saber como o Redis Pub/Sub funciona. A biblioteca ServiceStack.Redis e todas as suas APIs são apenas para Redis Server, não contém nenhuma API ServiceStack.Messaging MQ.

Portanto, apenas use ServiceStack.Redis para sua implementação de assinatura Redis Pub/Sub personalizada, ou seja, não use nenhuma API ServiceStack.Messaging, que é apenas para ServiceStack MQ.