5 de Setembro de 2025
Tombstone e exclusão lógica em estados derivados sem drift eterno
Quando exclusão lógica e tombstone entram sem regra clara, estado derivado acumula fantasma, divergência e custo de reconciliação.
Andrews Ribeiro
Founder & Engineer
3 min Intermediario Sistemas
O problema
Remover dado parece simples.
Na prática, quase nunca é.
Principalmente quando o sistema tem:
- projeções
- índices
- snapshots
- read models
- caches persistidos
Se o fonte apaga e o derivado não entende isso direito, nasce o clássico fantasma operacional:
- dado sumiu de um lado
- continua aparecendo do outro
- ninguém sabe se é bug ou política
Modelo mental
Vale separar três decisões:
- exclusão lógica no fonte
- tombstone para propagar remoção
- retenção do próprio marcador de exclusão
Essas três coisas não são automaticamente a mesma.
O que importa é a semântica:
- o dado deixou de existir?
- deixou de ser visível?
- ainda precisa ser auditável?
- o derivado precisa saber disso por quanto tempo?
Exemplo simples
Imagine um catálogo interno com produtos e um read model para busca.
Quando produto sai do ar, o sistema fonte pode:
- marcar
deleted_at - emitir evento de remoção
- manter tombstone por uma janela
Se nada disso estiver claro, a busca pode:
- continuar mostrando item removido
- remover cedo demais algo ainda auditável
- rebuildar e ressuscitar coisa que não devia voltar
O erro comum
O erro comum é tratar soft delete como solução universal.
Ele não é.
Às vezes é útil.
Às vezes só adia a decisão.
Outro erro comum é largar tombstone para sempre sem política de limpeza.
Aí você ganha:
- storage extra
- lógica confusa
- rebuild mais caro
- reconciliação eterna
O que normalmente ajuda
Normalmente ajuda decidir explicitamente:
- qual consumidor precisa saber da remoção
- por quanto tempo o tombstone precisa viver
- se o derivado reconstrói a partir do fonte ou do histórico de eventos
- quando a remoção pode ser compactada ou eliminada
Na prática, a escolha boa depende menos de dogma e mais de:
- auditabilidade
- reconstruibilidade
- custo operacional
- semântica do produto
Como um senior pensa
Quem já viu estado fantasma em produção costuma perguntar:
- este tombstone existe para quê exatamente?
- se eu apagar esse marcador, quem perde contexto?
- o rebuild sabe preservar remoção ou vai ressuscitar registro?
- soft delete aqui é regra de negócio ou medo de apagar?
Essa conversa reduz bastante drift invisível.
Ângulo de entrevista
Esse tema aparece em event-driven systems, read models, busca, analytics interno e operações de dados.
O entrevistador quer ver se você entende:
- que remoção também precisa de contrato
- que derivado precisa saber esquecer de forma coerente
- que tombstone sem política vira lixo operacional
Resposta forte costuma soar assim:
“Eu trataria remoção como parte explícita do contrato do derivado. Se usar tombstone, definiria por quanto tempo ele precisa existir e como o rebuild preserva essa semântica. O importante é não deixar o sistema acumular soft delete e marcador eterno sem uma razão clara.”
Takeaway direto
Estado derivado também precisa aprender a esquecer.
Se esquecer mal, o sistema passa a mentir devagar.
Resumo rápido
O que vale manter na cabeça
- Apagar no estado fonte não garante que o derivado saiba esquecer.
- Tombstone existe para propagar remoção com semântica, não para acumular fantasma eterno por inércia.
- Exclusão lógica sem política de expiração e rebuild vira drift operacional contínuo.
- Estado derivado maduro sabe quando marcar, quando remover e quando reconstruir.
Checklist de pratica
Use isto ao responder
- Meu derivado consegue saber que algo foi removido ou só percebe criação e atualização?
- O tombstone precisa existir por quanto tempo para cumprir sua função?
- Estou usando soft delete por necessidade real ou porque ninguém quis decidir o ciclo de vida?
- Se eu rebuildar esse derivado, a semântica de exclusão continua coerente?
Você concluiu este artigo
Compartilhar esta página
Copie o link manualmente no campo abaixo.