Skip to main content

RabbitMQ — durable vs persistent | CSharp

  • RabbitMQ — durable vs persistent | CSharp

Visão Geral

No RabbitMQ, durabilidade não é uma configuração única. Ela depende de duas camadas independentes:

  • Infraestrutura (fila / exchange)
  • Mensagem

Para que mensagens sobrevivam a um restart do broker, ambas precisam estar corretamente configuradas.


durable — Propriedade da fila

Configuração

channel.QueueDeclare(
queue: "minha_fila",
durable: true,
exclusive: false,
autoDelete: false
);

O que significa

  • A fila é persistida em disco
  • Se o RabbitMQ reiniciar, a fila continuará existindo
  • Se durable = false, a fila será removida no restart

O que durable garante

  • Persistência da estrutura da fila
  • Manutenção dos metadados da fila
  • Disponibilidade da fila após reinício do broker

O que durable não garante

  • Persistência das mensagens
  • Garantia de entrega
  • Retry automático

persistent — Propriedade da mensagem

Configuração

var props = channel.CreateBasicProperties();
props.Persistent = true;

O que significa

  • A mensagem é gravada em disco
  • Se o RabbitMQ reiniciar, a mensagem pode ser recuperada
  • Se Persistent = false, a mensagem é perdida no restart

O que persistent garante

  • Persistência do conteúdo da mensagem
  • Maior confiabilidade em falhas do broker

O que persistent não garante

  • Existência da fila
  • Entrega da mensagem ao consumer
  • Ausência de duplicidade

Regra de ouro

As duas configurações são complementares. Uma não funciona sem a outra.


Comportamento em restart do RabbitMQ

Fila (durable)Mensagem (persistent)Resultado
falsefalseTudo perdido
falsetrueMensagem perdida
truefalseMensagem perdida
truetrueMensagem preservada

Garantia real de persistência (produção)

Mesmo com fila durável e mensagem persistente, ainda existe risco de perda em falhas abruptas.

Para produção, utilize também Publisher Confirms.

Publisher Confirms

channel.ConfirmSelect();

channel.BasicPublish(
exchange: "",
routingKey: "fila",
basicProperties: props,
body: body
);

channel.WaitForConfirmsOrDie();

Isso garante que o producer saiba se o broker realmente aceitou a mensagem.


Conclusão

  • durable é responsabilidade da infraestrutura
  • persistent é responsabilidade da mensagem
  • Persistência real exige ambos, combinados com confirmação do broker