Buscando uma compreensão do ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish
Estou tendo dificuldade em separar o IRedisClient.PublishMessage
e IMessageQueueClient.Publish
e 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
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.