Skip to main content

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:

  1. Foram recebidas pelo broker.
  2. 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?

  1. Habilitar confirmações:

    • Você chama ConfirmSelect no canal.
    • Isso informa ao broker para começar a rastrear mensagens publicadas e enviar confirmações de recebimento (ACK ou NACK).
  2. 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.
  3. Eventos relacionados:

    • Eventos como BasicAcks e BasicNacks permitem ao publisher reagir às confirmações ou falhas.
  4. Espera síncrona (opcional):

    • Você pode usar WaitForConfirms para bloquear o código até que todas as confirmações pendentes sejam recebidas.

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 transaction que é 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.