fbpx
RabbitMQ Clustering #4 | Como as mensagens são persistidas
Publicado em: quarta-feira, 1 de fev de 2023
Categorias: RabbitMQ de A a Z

RabbitMQ é um excelente aliado na hora de entregar alta disponibilidade, resiliência, confiabilidade, eficiência e escalabilidade. Mas não basta subir uma instância, e sair usando de qualquer forma.

Um dos cenários mais comuns que já esbarrei em consultorias ou na comunidade, é a falta de atenção por total ignorância, produzindo como efeito, risco.

Na ansia de pegar um exemplo e tentar rodar com base no exemplo, ignoram-se os fundamentos, ignoram-se as boas prática e o entendimento de como RabbitMQ funciona e como consequência, o que está sendo implantado vai falhar, vai perder mensagens.

Não preciso nem dizer que nesse caso, a culpa é 100% do afobado e 0% do RabbitMQ.

Filas Duráveis, Ack Manual

Se você já me viu falar de RabbitMQ, deve ter visto que eu não trabalho com fila não durável, nem trabalho com ack automático.

Isso tem um motivo. Se a fila não for durável, não há nada que você faça, que produza como resultado o comportamento do RabbitMQ persistir sua mensagem em disco. Se a fila não é durável, um simples restart do RabbitMQ faz sua mensagem desaparecer.

Como esses 2 fundamentos (filas duráveis e ack manual) estão no coração da resiliência, eu, por uma questão didática, nunca uso outra estratégia.

Filas Duráveis

Se a fila for durável, há a possibilidade das mensagens serem persistidas em disco. Essa possibilidade se confirma quando a mensagem for enviada como persistente.

Toda mensagem tem um DeliveryMode. Esse DeliveryMode precisa ser setado com 2.

app.MapPost("/webhook", ([FromBody] ExecuteAnythingRequest model, [FromServices] RingBuffer<IModel> modelBuffer, [FromServices] ActivitySource activitySource) =>
{
    var currentActivity = Activity.Current ?? activitySource.SafeStartActivity("/webhook", ActivityKind.Server);

    using (var modelBuffered = modelBuffer.Accquire())
    {
        IBasicProperties basicProperties = modelBuffered.Instance.CreateBasicProperties()
            .SetDurable()
            .SetTelemetry(currentActivity);

        var dataToSend = Encoding.UTF8.GetBytes(System.Text.Json.JsonSerializer.Serialize(model));

        modelBuffered.Instance.BasicPublish(
            exchange: "",
            routingKey: "customer_ExecuteAnything_queue",
            mandatory: true,
            basicProperties: basicProperties,
            body: dataToSend
        );
    }

    return currentActivity?.Id;

})
.WithName("webhook");

app.Run();

Então se você esbarrar em uma chamada ao método Model.BasicPublish, onde as BasicProperties é nulo. Tenha certeza que a mensagem nunca, sob hipótese algum será persistida em disco.

Já, se houver BasicProperties, tem de avaliar se DeliveryMode é igual à 2.

Se sim, então nos resta saber se a fila é durável ou não.

Portanto:

Se a fila for durável e a mensagem for persistente, a mensagem nunca, sob hipótese alguma, será armazenada somente em memória.

Se essas 2 condições forem verdadeiras, a mensagem sempre, necessariamente, obrigatoriamente, será persistida em disco.

E se estivermos falando de Quorum Queues, aí estamos falando de um tipo de fila que obrigatoriamente é durável.

Essas são informações que estão na documentação, de forma clara, límpida e transparente.

A ideia de criar um post só falando desse pequeno tópico vem da quantidade absurda de bobagens que escuto e leio sobre RabbitMQ. Um show de horrores.

Abaixo deixo partes da documentação.

Link

Você pediu e agora virou curso. Mensageria .NET é minha formação de especialista em RabbitMQ com .NET, onde ensino RabbitMQ do básico, cada fundamento, cada detalhe, ao avançado.

Onde você vai sair do zero absoluto e vai conseguir criar, projetar e corrigir soluções .NET com RabbitMQ.

Além de contar mais 3 outros bonus incríveis para ajudar todos que precisam de um up na carreira.

RabbitMQ Newsletter

Novidades e ofertas de conteúdo exclusivo e único no Brasil.

Hoje com orgulho somos referência quando se fala em RabbitMQ com .NET.

São quase 10 anos usando RabbitMQ em projetos .NET com C#, implantando, convencendo times e mostrando o caminho para aslcançar sos 5 benefícios.

Após centenas de pedidos, criei um curso dedicado aos profissionais .NET. 

Aqui nessa newsletter eu te entrego promoções e links especiais! Cola aqui, tem muita coisa legal!

Luiz Carlos Faria

Meu primeiro contato com RabbitMQ foi em 2013.

Eu estava sozinho na definição de uma arquitetura para a reestruturação de uma integração enquanto meu time estava ocupado com o dia-a-dia.

Naquela época eu precisava de apenas 1 ou 2 recursos que o RabbitMQ entregava.

Nas primeiras semanas e meses em produção pude perceber coisas que não estavam escritas em lugar algum, benefícios e formas de uso das quais poderiam resolver anos de frustração.

Desde então RabbitMQ tem sido meu aliado na restruturação de projetos dos mais variados.

E por mais simples que seja, ainda é possível, 10 anos depois, gerar surpresas com novas abordagens que geram novos benefícios.

7 dias

É tudo que precisa para sair do zero, à produção!

Com conforto, com segurança, e com apoio.

Desde que você já seja um desenvolvedor profissional.

Se você quer entregar mais Disponibilidade, Eficiência, Resiliência, Confiabilidade e/ou Escalabilidade, em projetos .NET, aqui é o seu lugar.

0 comentários

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Lives

Fique de olho nas lives

Fique de olho nas lives no meu canal do Youtube, no Canal .NET e nos Grupos do Facebook e Instagram.

Aceleradores

Existem diversas formas de viabilizar o suporte ao teu projeto. Seja com os treinamentos, consultoria, mentorias em grupo.