FolioPierEstudos de TI

Webhook repetido e processamento em fila

Nota 7 de 11 · 6 min de leitura
Nesta página
  1. O relato e as evidências
  2. O que cada confirmação significa
  3. A queda entre o COMMIT e o ack
  4. A retomada e a conferência do efeito
  5. O registro do atendimento

O receptor de eventos recebeu duas vezes o mesmo aviso de pagamento, e a fila mostra duas mensagens iguais. A proposta de apagar a segunda mensagem e marcar a primeira como concluída decide sem saber o que já foi aplicado, e o caso mostra como acompanhar o evento da chegada até o efeito no banco.

O relato e as evidências

O site de vendas gerou o pedido PED-0002, e o serviço de pagamentos avisou o pagamento PAG-0002 pelo webhook. O suporte encontra duas chegadas do mesmo aviso e duas mensagens na fila, e o pedido continua na lista de atendimento, com o receio de uma baixa de estoque ou de um faturamento em dobro. Alguém propõe apagar a segunda mensagem e marcar a primeira como concluída. O receptor registra:

  • 2026-10-07T11:00:00-03:00 evento=EVT-0002 pagamento=PAG-0002 pedido=PED-0002 chegada=1 resposta=200
  • 2026-10-07T11:00:20-03:00 evento=EVT-0002 pagamento=PAG-0002 pedido=PED-0002 chegada=2 resposta=200

Pelo contrato, o serviço de pagamentos pode repetir um aviso e não garante a ordem de entrega. Ainda faltam a política de duplicidade da integração, o significado da resposta 200, o histórico do consumo e a situação do pedido no banco.

As duas chegadas têm a mesma identidade de evento e, por isso, não indicam dois pagamentos. Também não mostram quantas vezes o efeito foi aplicado. Continuam possíveis uma duplicata já descartada, mensagens ainda à espera, um processamento pela metade e um efeito repetido. Apagar uma entrega sem saber o que foi aplicado pode eliminar um trabalho ainda necessário, e o próximo passo é acompanhar o EVT-0002 da recepção até o efeito e a confirmação do consumo.

O que cada confirmação significa

A configuração da integração mostra a sequência do receptor: ele valida a assinatura, publica a mensagem em uma fila do RabbitMQ, espera a confirmação de publicação do broker e só então responde 200. O consumidor da fila usa o ack manual, enviado depois do COMMIT da transação local. O receptor não descarta duplicatas, e essa proteção fica com o consumidor, que grava a identidade de cada evento tratado.

Com essa configuração, a resposta 200 confirma a publicação na fila, e não a atualização do pedido, e o histórico do broker confirma as duas publicações. A confirmação de publicação e o ack do consumidor respondem a perguntas diferentes: a primeira diz que o broker recebeu a mensagem, e o segundo diz que o consumidor aceitou a entrega como tratada.

Outras configurações mudariam a leitura. Com a assinatura recusada, faltaria um aceite válido do aviso, e, sem a confirmação de publicação, seria preciso investigar uma publicação com o retorno perdido. Um ack automático, enviado no momento da entrega, também não provaria a transação concluída.

A queda entre o COMMIT e o ack

O histórico do consumidor mostra o tratamento da primeira mensagem:

  • evento=EVT-0002 consumidor=consumidor-01 transacao=TX-0002 iniciada
  • evento=EVT-0002 consumidor=consumidor-01 transacao=TX-0002 commit_confirmado
  • consumidor=consumidor-01 conexao_encerrada antes_do_ack

No banco local, o pagamento PAG-0002 já aparece aplicado ao pedido, e a tabela de eventos tratados tem uma linha com o EVT-0002. A equipe de desenvolvimento confirma que as duas gravações acontecem na mesma transação e que a identidade do evento tem uma chave única. A primeira transação terminou, e a falha aconteceu antes do ack. Por isso, o broker entrega a mensagem de novo, com o trabalho já aplicado.

A reentrega não indica que a primeira transação foi desfeita. O consumidor, com a proteção da integração, reconhece a duplicata pela identidade gravada e confirma a entrega sem repetir o efeito. Sem um registro confiável da identidade, os efeitos precisariam ser reconciliados antes de qualquer novo processamento. Com a transação desfeita e nada aplicado, a mensagem ainda representaria um trabalho necessário.

A retomada e a conferência do efeito

Depois da retomada do consumidor, chegam a reentrega da primeira mensagem e a segunda publicação. Nas duas, o consumidor encontra a identidade do EVT-0002, registra a duplicata sem nova aplicação e confirma a entrega. A consulta final encontra um único efeito do pagamento PAG-0002 no pedido PED-0002, e a tela recarregada mostra o pedido pago, fora da lista de pendências.

A conferência vale para o efeito examinado. A baixa de estoque, o faturamento e as outras ações ligadas ao pedido têm identificadores e registros próprios, fora daquela transação, e cada uma precisa da própria conferência. O motivo da repetição pelo serviço de pagamentos também continua sem confirmação: o serviço pode não ter recebido a primeira resposta a tempo ou ter seguido outra regra prevista no contrato, e faltam os registros dele.

Se uma entrega tivesse ido para a DLQ, o motivo do desvio seria lido antes de qualquer devolução à fila. A DLQ não significa que a mensagem não foi aplicada, e a devolução de todas as mensagens não substitui a proteção contra a repetição.

O registro do atendimento

O registro separa a repetição do aviso da repetição do efeito:

  • Ocorrência: o EVT-0002 chegou duas vezes ao receptor e gerou duas publicações confirmadas na fila;
  • Evidências: a primeira transação do consumidor teve COMMIT, com o efeito e a identidade do evento gravados juntos, e a conexão caiu antes do ack;
  • Tratamento: o consumidor reconheceu a reentrega e a segunda publicação pela identidade gravada e confirmou as entregas sem repetir o efeito, sem mensagens apagadas nem estados forçados;
  • Validação: o banco e a tela mostram um único pagamento aplicado ao pedido PED-0002;
  • Pendências: o motivo da repetição pelo serviço de pagamentos e a conferência própria do estoque e do faturamento do pedido.

No suporte

Diante de um aviso repetido, convém acompanhar a identidade do evento da chegada até o efeito e a confirmação do consumo, antes de apagar ou de reprocessar qualquer mensagem. A repetição do aviso só vira repetição do efeito quando a proteção do consumidor falha.

Para guardar

  • Um aviso repetido não prova um pagamento repetido nem um efeito repetido.
  • A confirmação de publicação e o ack do consumidor respondem a perguntas diferentes.
  • Uma queda entre o COMMIT e o ack produz a reentrega de um trabalho já aplicado.
  • A identidade do evento, gravada com o efeito na mesma transação, protege contra a repetição.
  • A garantia de uma transação local não cobre o estoque, o faturamento nem os serviços externos.
Se o banco tivesse o efeito do pagamento, mas nenhuma linha do EVT-0002 na tabela de eventos tratados, o que aconteceria com as mensagens?

As mensagens ficariam sem novo processamento até a reconciliação. O efeito já existe, e um consumidor sem a identidade gravada aplicaria o pagamento de novo. A reconciliação confere o pedido e o pagamento, registra a identidade do evento e só então confirma as entregas.

A segunda chegada do aviso prova que o serviço de pagamentos cobrou o cliente duas vezes?

Não. As duas chegadas têm o mesmo identificador de evento e o mesmo pagamento, PAG-0002. A repetição do aviso é prevista no contrato, e a consulta do pagamento no serviço mostra se existe uma única cobrança.

Publicado a partir do Obsidian · FolioPier