1 Cenário
Desenho e falha
Com o padrão ou sem ele. A escolha mostra o problema e o que queremos melhorar. Uma falha troca o roteiro inteiro.
Consistência · Intermediário
Grava o efeito de negócio e o identificador da mensagem na mesma transação local.
Os controles percorrem eventos já definidos. O relógio da tela só regula a velocidade visual. A sequência não depende de um Kafka real nem de temporizadores para decidir o resultado.
Ative uma falha para trocar o roteiro inteiro. A troca recomeça a execução, para que o estado mostrado continue correspondente ao cenário escolhido.
1 Cenário
Com o padrão ou sem ele. A escolha mostra o problema e o que queremos melhorar. Uma falha troca o roteiro inteiro.
2 Percurso
A trilha mostra cada etapa, inteira, na mesma tela. O relógio só muda a velocidade, não o resultado.
3 Agora
O texto ao lado do diagrama explica o evento que está na tela.
4 Registros
As tabelas provam o efeito: pedido, mensagem, cobrança ou ack.
2 Percurso
Aguardando a mensagem
Cada etapa automática leva 1,6 s. Espaço inicia ou pausa. As setas mudam a etapa.
4 Registros
| Cobrança | Pedido | Estado |
|---|---|---|
| Nenhuma linha | ||
| Mensagem | Evento | Estado |
|---|---|---|
| Nenhuma linha | ||
| Mensagem | Ack |
|---|---|
| Nenhuma linha | |
Limite do padrãoEsta é uma simulação no navegador. A Inbox grava o identificador da mensagem junto com o efeito. Ela não torna o broker exatamente uma vez.
Um consumidor recebe a mesma mensagem mais de uma vez. Se cada entrega aplica o efeito de novo, o pedido gera duas cobranças, dois e-mails ou dois débitos.
O broker entrega ao menos uma vez. A janela entre gravar o efeito e confirmar o offset é o lugar em que a repetição aparece.
Sem Inbox, gravar a cobrança e confirmar o Kafka são operações separadas. Uma reentrega repete a cobrança, porque nada lembra o identificador da mensagem. A ordem inversa confirma o broker antes do efeito e a cobrança pode se perder.
Com Inbox, a cobrança e o identificador entram na mesma transação local. O ack sai depois do commit. A próxima entrega encontra a mensagem e não repete o efeito.
Use o padrão quando o efeito do consumidor não pode acontecer duas vezes e o broker pode entregar a mensagem de novo.
A cobrança e a inbox usam a mesma transação. A consulta antes do INSERT é intencionalmente incompleta: em produção, a chave única da mensagem precisa recusar a segunda inserção. O ack continua fora da transação. O consumidor sem inbox mostra o que falta.
// Fragmento ilustrativo. Charges e InboxMessages usam o mesmo DbContext
// e a mesma transação do banco. O ack do broker fica fora dessa transação.
await using var transaction =
await dbContext.Database.BeginTransactionAsync(cancellationToken);
var seen = await dbContext.InboxMessages
.AnyAsync(message => message.Id == orderCreated.MessageId, cancellationToken);
if (!seen)
{
dbContext.InboxMessages.Add(
InboxMessage.Create(orderCreated.MessageId, "OrderCreated"));
dbContext.Charges.Add(Charge.For(orderCreated.OrderId));
await dbContext.SaveChangesAsync(cancellationToken);
await transaction.CommitAsync(cancellationToken);
}
await consumer.AcknowledgeAsync(orderCreated.MessageId, cancellationToken);
// Consumidor sem inbox, incompleto de propósito.
// Esta versão não guarda o identificador da mensagem.
// Se o processo parar antes do ack, a reentrega cria outra cobrança.
// Se o ack sair antes do commit, o efeito pode se perder.
dbContext.Charges.Add(Charge.For(orderCreated.OrderId));
await dbContext.SaveChangesAsync(cancellationToken);
await consumer.AcknowledgeAsync(orderCreated.MessageId, cancellationToken);
Responda com o que a simulação mostrou. Cada questão abre a própria resposta.
Resposta
Encontrar msg-1042 na inbox e não criar outra cobrança. Depois pode confirmar o offset. A repetição veio do broker; o efeito já está protegido pela transação local.
Resposta
Não. O ack já saiu e o efeito não existe. A inbox não recupera um efeito que nunca foi gravado. A ordem segura grava a cobrança e o identificador, e só então confirma o broker.
Resposta
A reserva precisa ser a própria inserção única, com restrição de chave. Consultar e inserir em comandos separados abre corrida.
Resposta
Não. Marcar como processada faz o efeito ausente parecer concluído. A mensagem fica em falha, sem a cobrança.
Resposta
Não. O broker continua entregando ao menos uma vez. A inbox impede que a segunda entrega repita o efeito já confirmado.