ConfirmSelect do RabbitMQ | CSharp
- ConfirmSelect do RabbitMQ | CSharp
O método ConfirmSelect no RabbitMQ ativa o modo de confirmações para o publisher (Publisher Confirms) no canal AMQP. Ele é usado para garantir que as mensagens enviadas pelo publisher foram de fato recebidas pelo broker (RabbitMQ) e persistidas na fila. Isso oferece um nível adicional de confiabilidade ao sistema de mensagens.
Contexto do ConfirmSelect
Quando um aplicativo publica mensagens para o RabbitMQ, ele precisa saber se as mensagens:
- Foram recebidas pelo broker.
- Não foram perdidas devido a falhas no broker ou no sistema.
No modo padrão, o RabbitMQ não confirma automaticamente as mensagens publicadas, o que pode levar a problemas em sistemas críticos se mensagens forem perdidas.
Com ConfirmSelect, o RabbitMQ permite que o publisher receba confirmações explícitas (ACKs) de que uma mensagem foi:
- Processada com sucesso pelo broker.
- Persistida, se necessário (caso a fila seja durável).
Como funciona?
-
Habilitar confirmações:
- Você chama
ConfirmSelectno canal. - Isso informa ao broker para começar a rastrear mensagens publicadas e enviar confirmações de recebimento (ACK ou NACK).
- Você chama
-
Confirmações (ACK/NACK):
- Para cada mensagem publicada, o broker envia:
- ACK (Acknowledgment): A mensagem foi recebida e processada com sucesso.
- NACK (Negative Acknowledgment): Algo deu errado ao processar a mensagem.
- Para cada mensagem publicada, o broker envia:
-
Eventos relacionados:
- Eventos como
BasicAckseBasicNackspermitem ao publisher reagir às confirmações ou falhas.
- Eventos como
-
Espera síncrona (opcional):
- Você pode usar
WaitForConfirmspara bloquear o código até que todas as confirmações pendentes sejam recebidas.
- Você pode usar
Por que usar ConfirmSelect?
- Confiabilidade: Garante que as mensagens publicadas não sejam perdidas, especialmente em sistemas críticos.
- Detecção de falhas: Ajuda a identificar se houve problemas no broker durante o processamento.
- Garantia de entrega: Trabalha como um mecanismo para garantir que as mensagens realmente chegaram ao broker, diferente do protocolo
transactionque é mais pesado.
Quando usar?
- Sistemas críticos: Quando perder mensagens pode causar falhas graves, como sistemas bancários, logística ou e-commerce.
- Mensagens importantes: Onde cada mensagem precisa ser entregue e processada com sucesso.
- Alternativa leve a transações: Fornece confiabilidade sem o overhead das transações no RabbitMQ.
Exemplo de Uso
Ativando o modo de confirmação:
this.model.ConfirmSelect();
Publicando e aguardando confirmações:
this.model.BasicPublish(exchange, routingKey, properties, messageBody);
if (!this.model.WaitForConfirms(TimeSpan.FromSeconds(5)))
{
Console.WriteLine("Falha ao confirmar a mensagem.");
}
else
{
Console.WriteLine("Mensagem confirmada com sucesso.");
}
Resumo
- O que faz?: Garante que o publisher receba uma confirmação (ACK ou NACK) sobre o status da mensagem enviada ao RabbitMQ.
- Por que é importante?: Adiciona confiabilidade ao envio de mensagens em sistemas críticos.
- Alternativa leve a transações: Funciona como um método mais eficiente para garantir entregas de mensagens sem usar transações completas.