RabbitMQ — durable vs persistent | CSharp
- RabbitMQ —
durablevspersistent| 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 |
|---|---|---|
| false | false | Tudo perdido |
| false | true | Mensagem perdida |
| true | false | Mensagem perdida |
| true | true | Mensagem 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 infraestruturapersistenté responsabilidade da mensagem- Persistência real exige ambos, combinados com confirmação do broker