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.
0 comentários