ADR-012 — Publicação de eventos de histórico de cart é fire-and-forget com duplicatas intencionais no idempotency
Status: Aceito
Data: 2026-06-12
Contexto: Task #196022 — Alterar POST api/cart para publicar RecommendationCartCreated na fila FIFO
O handler PublishRecommendationHistoryHandler adota dois comportamentos deliberados:
- Fire-and-forget: falha no
SendFifoAsyncé logada e o context retorna sem erro. A criação do carrinho já foi persistida com sucesso — a observabilidade não pode penalizar o fluxo principal. - Duplicatas no idempotency: quando o
CartTransactionIdHandlerencontra um cart já existente, o chain pode chegar aoSaveCartHandlercomId != 0(que pula o save), mas o handler de publicação executa mesmo assim. O eventoRecommendationCartCreatedé republicado — duplicatas no histórico são aceitas para diagnóstico de re-execuções.
Opções consideradas
| Decisão | Alternativa rejeitada | Motivo da rejeição |
|---|---|---|
| Fire-and-forget (logar e seguir) | Adicionar erro no BaseResult e interromper o chain | A criação do cart não pode ser revertida por falha de publicação de evento de histórico; o SQS garante entrega, e falhas transitórias se resolvem com retry do próprio SQS |
| Duplicatas no idempotency | Pular publicação se CartModel.Id != 0 antes do save | Re-execuções por idempotency são eventos raros e diagnosticáveis; uma duplicata no histórico append-only é preferível a perder a visibilidade de que o mesmo RecommendationsId passou pelo endpoint mais de uma vez |