O Dilema que Todo Arquiteto Enfrenta
Como construir sistemas que sejam coesos o suficiente para serem compreensíveis e desacoplados o suficiente para evoluírem independentemente?
De um lado: o monolito — simplicidade inicial que vira pesadelo.
Do outro: microservices — flexibilidade que pode virar complexidade operacional.
E se existisse um framework mental que equilibrasse essas forças? Existe. E vem de um lugar inesperado: um livro de filosofia de 1967.
Arthur Koestler e o Conceito de Holon
Em 1967, o filósofo húngaro-britânico Arthur Koestler publicou "The Ghost in the Machine". Frustrado com dicotomias simplistas, ele criou um termo novo: holon.
Etimologia
- holos (grego): "todo", "inteiro"
- sufixo -on: conota "partícula" (como próton, nêutron)
Holon = uma entidade que é simultaneamente um TODO completo e uma PARTE de algo maior.
A Dualidade Fundamental
"Cada holon tem duas tendências: uma tendência integrativa de funcionar como parte de um todo maior, e uma tendência auto-afirmativa de preservar sua autonomia individual."
— Arthur Koestler
Koestler chamou isso de "efeito Janus" — como o deus romano de duas faces. Todo holon olha simultaneamente para dentro (sua integridade) e para fora (o sistema maior).
Holons na Natureza
Seu corpo é uma holarquia perfeita:
ORGANISMO
└── ÓRGÃO (coração)
└── TECIDO (músculo cardíaco)
└── CÉLULA
└── ORGANELA
Cada nível é:
- Autônomo: funciona por si
- Integrado: contribui para o todo
Quando esse equilíbrio quebra? Câncer — células que mantêm autonomia mas perdem integração.
O Problema das Arquiteturas Tradicionais
Monolito Mal Estruturado
Componentes são apenas partes — sem autonomia real:
- Não testam isoladamente
- Não deployam independentemente
- Falha propaga para tudo
Suprimiu a tendência auto-afirmativa.
Microservices Mal Implementados
Dezenas de serviços com HTTP síncrono formando um "distributed monolith":
- Chamadas síncronas em cadeia
- Falha de um derruba todos
- Complexidade sem benefício
Autonomia nominal, integração caótica.
Self-Contained Systems: Holonomia na Prática
A empresa alemã INNOQ formalizou o conceito de Self-Contained Systems (SCS).
Características
| Princípio | Descrição |
|---|---|
| Autônomo | Aplicação web completa |
| Vertical Slice | UI + lógica + dados próprios |
| Sem sync no request/response | Não chama outros SCS sincronamente |
| Equipe única | Um time por SCS |
A Regra de Ouro
Outros SCS não devem ser acessados sincronamente dentro do ciclo request/response.
Se precisa de dados de outro SCS → tem uma cópia local atualizada por eventos.
SCS vs Microservices: Comparação Honesta
O que NÃO é diferença
❌ "SCS usa async, microservices usa sync"
Errado. Microservices modernos usam Kafka, RabbitMQ, event-driven architecture.
As diferenças reais
| Aspecto | SCS | Microservices |
|---|---|---|
| Quantidade | 5-25 | 50-500+ |
| UI | Obrigatória | Opcional |
| Granularidade | Domínio de negócio | Mais granular |
| Sync no request | Proibido | Permitido |
Anatomia de um Holon de Software
┌─────────────────────────────────────────────┐
│ HOLON: Pedidos │
├─────────────────────────────────────────────┤
│ INTERFACE PÚBLICA │
│ • API REST/GraphQL │
│ • Eventos publicados (Kafka) │
│ • Eventos consumidos │
├─────────────────────────────────────────────┤
│ LÓGICA DE DOMÍNIO │
│ • Regras de negócio │
│ • Workflows/Sagas │
├─────────────────────────────────────────────┤
│ PERSISTÊNCIA │
│ • Banco próprio │
│ • Réplicas de dados externos │
├─────────────────────────────────────────────┤
│ AUTO-REGULAÇÃO │
│ • Health checks │
│ • Circuit breakers │
│ • Métricas │
└─────────────────────────────────────────────┘
A Regra de Dependência
// ❌ ERRADO
import { EstoqueService } from '../estoque';
// ✅ CORRETO
await eventBus.publish({
type: 'PedidoCriado',
payload: pedido
});
Holons não importam outros holons diretamente.
Desafios da Comunicação Assíncrona
1. Ordenação de Eventos
Enviado: [A, B, C]
Recebido: [A, C, B] 😱
Solução: Kafka garante ordem por partição.
2. Duplicação (at-least-once)
if (await jaProcessado(evento.id)) return;
await processar(evento);
await marcarProcessado(evento.id);
3. Eventual Consistency
Aceite como realidade. UI mostra "processando..." quando necessário.
4. Debugging Distribuído
Correlation ID em todos os logs + Jaeger/Zipkin.
Quando Usar (e Quando Não)
✅ Use quando:
- Múltiplos domínios distintos
- Times precisam de independência
- Alta disponibilidade é crítica
- Escala diferenciada por domínio
❌ Evite quando:
- Sistema pequeno, equipe única
- MVP ou prova de conceito
- Consistência forte é requisito
- Sem experiência em sistemas distribuídos
Caminho de Evolução
Monolito Modular
↓
Schemas separados
↓
Introduzir mensageria
↓
Sistema Holonômico Completo
Evolua quando a dor justificar, não antes.
Conclusão
Holonomia não é bala de prata. É um framework mental.
O que Koestler nos ensinou: sistemas resilientes mantêm equilíbrio entre ser todo e ser parte.
Monolitos, microservices, SCS — todos podem funcionar. A sabedoria está em escolher certo para o contexto.
Referências
- Koestler, Arthur. "The Ghost in the Machine" (1967)
- SCS Architecture
- Microservices.io - Saga Pattern
- Apache Kafka
"O todo é mais do que a soma das partes, mas as partes são mais do que fragmentos do todo."
Gostou? Deixe um ❤️ e compartilhe com quem está enfrentando decisões de arquitetura!
Quer discutir? Comenta aí embaixo 👇
Top comments (0)