Dual-Write Problem
O problema de dual-write acontece quando um sistema tenta persistir a mesma mudanca em dois sistemas diferentes ao mesmo tempo, por exemplo:
- Banco de dados + broker
- Banco + cache
- Dois bancos diferentes
Por que isso acontece
Seção intitulada “Por que isso acontece”Falta de atomicidade distribuida
Seção intitulada “Falta de atomicidade distribuida”Nao existe transacao ACID entre banco e broker de forma confiavel em sistemas distribuidos.
BEGIN TRANSACTION write DB publish eventCOMMITFalhas parciais
Seção intitulada “Falhas parciais”Entre as operacoes podem acontecer falha de rede, timeout, crash da aplicacao e retries duplicados.
Retries sozinhos nao resolvem
Seção intitulada “Retries sozinhos nao resolvem”Tentativas de correcao podem gerar eventos duplicados e efeitos colaterais inesperados.
Impacto real
Seção intitulada “Impacto real”- Dados inconsistentes entre servicos
- Eventos fantasmas
- Quebra de invariantes de negocio
- Bugs dificeis de reproduzir
Abordagens ingenuas
Seção intitulada “Abordagens ingenuas”So fazer dois writes
save DBpublish eventNao garante consistencia.
2PC
Tem alta complexidade e baixa adocao em microsservicos modernos.
Estrategias corretas
Seção intitulada “Estrategias corretas”Outbox Pattern
Seção intitulada “Outbox Pattern”Persiste dados e evento no mesmo banco, na mesma transacao. Um processo separado le a tabela outbox e publica no broker.
Vantagens: atomicidade local, eventos nao se perdem, desacoplamento.
Trade-offs: latencia maior e complexidade operacional.
Ferramentas como Debezium observam mudancas direto no banco.
Vantagens: transparente para a aplicacao.
Desvantagens: infraestrutura mais complexa.
Listen to Yourself
Seção intitulada “Listen to Yourself”O proprio servico publica e consome os eventos, derivando o estado a partir deles.
Event Sourcing
Seção intitulada “Event Sourcing”Eventos se tornam a fonte de verdade:
append event -> event store -> projecoes derivadasComparacao
Seção intitulada “Comparacao”| Estrategia | Consistencia | Complexidade | Controle |
|---|---|---|---|
| Dual-write ingenuo | Nenhuma | Baixa | Baixo |
| 2PC | Forte | Muito alta | Alto |
| Outbox | Eventual | Media | Alto |
| CDC | Eventual | Alta | Medio |
| Event sourcing | Forte | Muito alta | Muito alto |
Insight principal
Seção intitulada “Insight principal”O problema nao e escrever duas vezes. E tentar garantir consistencia sem um mecanismo confiavel.
Boas praticas
Seção intitulada “Boas praticas”- Idempotencia em consumidores
- Retry seguro
- Ordenacao de eventos quando necessario
- Monitoramento de inconsistencias
- Dead letter queues
- Dual-write gera inconsistencias entre sistemas
- A causa principal e a falta de transacao distribuida
- Retry sozinho nao resolve
- Outbox, CDC e event sourcing sao caminhos reais