🌿 Strangler Fig Pattern
Migração incremental do legado em 3 fases — sem big bang, sem parar a produção
O Strangler Fig substitui o legado peça por peça, roteando tráfego gradualmente para o novo sistema até o legado "morrer" — como uma figueira que envolve e mata a árvore hospedeira.
Por que não reescrever tudo?
| Abordagem | Risco | Valor entregue | Rollback |
|---|---|---|---|
| Big Bang Rewrite | Altíssimo, concentrado no go-live | Zero até go-live | Impossível |
| Strangler Fig | Baixo e distribuído | Incremental desde dia 1 | A qualquer momento |
As 3 fases
0Backfill
antes do primeiro flip da flagBackfill único via ACL Inbound (snapshot), depois catch-up via WAL/CDC até o delta cair para segundos. Legado ainda é a fonte da verdade. O validator do dia 1 confirma a convergência do backfill.
Backfill: histórico traduzido pela ACL Inbound
Catch-up: WAL/CDC até o delta ficar em segundos
Legado continua autoritativo durante todo o backfill
Validator: primeiro job é confirmar a convergência
1Dual Write
migration-phase = "dual-write"Ambos os bancos recebem cada write. Novo é autoritativo. Espelho via outbox → worker → ACL Outbound. Sync validator compara os dois.
Writes: novo + evento LegacyMirrorRequested no outbox (1 commit)
Worker consome o outbox e espelha: retry automático, DLQ
Reads: qualquer sistema pode servir
Sync Validator Job: janela por UpdatedAt + watermark
2New is Source of Truth
migration-phase = "new-source-of-truth"Writes vão 100% pro novo. SyncJob (IHostedService) atualiza legado periodicamente. Eventual consistency deliberada.
Writes: 100% pro novo sistema
SyncJob: polling a cada 30s, atualiza legado via ACL
ACL Outbound: ainda necessária para o SyncJob
Legado fica alguns segundos atrás — eventual consistency
3Legacy Off
migration-phase = "legacy-off"Legado desligado. Gateway roteia 100% pro novo. SyncJob e ACL Outbound removidos. Migração concluída.
Legacy DB: desligado e arquivado
SyncJob: removido completamente
ACL Outbound: removida
ACL Inbound: pode permanecer para clientes externos legacy
❓ Quando você sairia da Fase 1 para a Fase 2?
Quando você tem confiança de que o novo sistema está correto. O sync validator job não deve estar logando discrepâncias, os testes de integração passam, e o time está confortável com o modelo de dados do novo sistema. Você não precisa de zero discrepâncias — você precisa de zero discrepâncias que importam para o negócio.