Salta al contenuto principale

Domain Knowledge Base - Microservices

Come funziona il dominio, prima di scrivere una riga di codice? Scegli un documento dall'albero a sinistra: ogni pagina spiega una parte del modello.

Regole di Business - Microservices

Questo documento elenca le regole di business fondamentali del dominio Microservices, identificate con codice univoco BR-NNN. Ogni regola è technology-independent e descrive un vincolo invariante sull'architettura a servizi distribuiti.

---

BR-001 - Un servizio possiede i propri dati

Codice: BR-001 Nome: Ogni Servizio è l'unico proprietario del proprio datastore Descrizione: Nessun servizio accede direttamente al database di un altro servizio. La condivisione dei dati avviene solo tramite l'API pubblica o eventi del servizio proprietario. Questo garantisce loose coupling e autonomia di deploy. Motivazione: Prevenire accoppiamento nascosto a livello di schema; consentire evoluzione indipendente. Priorità: CRITICA Attori: Service Owner Violazione: accesso cross-database rilevato in code review → rifiuto del merge. Tracciabilità: glossary "Loose Coupling", "Polyglot Persistence", "Bounded Context"; BC-01.

---

BR-002 - Idempotenza dei consumatori di messaggi

Codice: BR-002 Nome: Ogni handler di un MessaggioBroker deve essere idempotente Descrizione: Poiché i broker garantiscono tipicamente consegna at-least-once, lo stesso messaggio può arrivare più volte. Il consumatore deve produrre lo stesso effetto a fronte di consegne duplicate, deduplicando per chiave di messaggio. Motivazione: Evitare effetti duplicati (doppio addebito, doppia creazione) in presenza di ritrasmissioni. Priorità: ALTA Attori: Service Owner, Service Mesh Tracciabilità: glossary "Idempotency", "Dead Letter Queue (DLQ)", "Outbox Pattern".

---

BR-003 - Comunicazione sincrona protetta da Circuit Breaker

Codice: BR-003 Nome: Ogni chiamata sincrona cross-servizio è protetta da un CircuitBreaker Descrizione: Le chiamate sincrone tra servizi devono passare per un circuit breaker con timeout esplicito. Quando il tasso di errori supera la soglia, il circuito si apre e le chiamate falliscono velocemente (fail-fast) con eventuale fallback, prevenendo l'esaurimento delle risorse. Motivazione: Evitare il cascading failure in cui un servizio lento fa cadere l'intero sistema. Priorità: CRITICA Attori: Service Owner, Service Mesh Violazione: una chiamata sincrona senza protezione viene segnalata come anti-pattern di resilienza. Tracciabilità: glossary "Circuit Breaker", "Fault Tolerance", "Resilience", "Bulkhead"; state-machines/circuit-breaker-lifecycle.md.

---

BR-004 - Transazioni distribuite gestite via Saga

Codice: BR-004 Nome: Una transazione che attraversa più servizi è realizzata come SagaTransaction Descrizione: Non esistono transazioni ACID distribuite. Un'operazione che coinvolge più servizi è una sequenza di transazioni locali con azioni compensative per ogni step, coordinate via orchestration o choreography. In caso di fallimento, si esegue il rollback compensativo. Motivazione: Garantire consistenza eventuale senza lock distribuiti. Priorità: ALTA Attori: Orchestratore Saga, Service Owner Tracciabilità: glossary "Saga", "Eventual Consistency", "Orchestration", "Choreography"; workflows/saga-transaction.md.

---

BR-005 - Registrazione e health check obbligatori

Codice: BR-005 Nome: Ogni Servizio si registra nel Service Registry ed espone un health check Descrizione: Un'istanza di servizio si registra all'avvio ed espone un endpoint di health/readiness. Le istanze non sane sono rimosse dal routing. La service discovery si basa sul registro per instradare il traffico solo verso istanze sane. Motivazione: Consentire scaling dinamico e routing affidabile senza configurazione statica. Priorità: ALTA Attori: Service Mesh, Service Owner Tracciabilità: glossary "Service Discovery", "Service Registry", "Service-Level Objective (SLO)"; events/domain-events.md evento HealthCheckFallito.

---

BR-006 - Versionamento dei contratti senza rotture

Codice: BR-006 Nome: Un ContrattoServizio evolve in modo backward-compatible o introduce una nuova versione Descrizione: Modifiche a un'API o a uno schema di evento non devono rompere i consumatori esistenti. I cambiamenti additivi sono ammessi; i cambiamenti breaking richiedono una nuova versione del contratto e un periodo di coesistenza. I consumer-driven contract test verificano la compatibilità. Motivazione: Permettere deploy indipendenti senza coordinare il rilascio di tutti i consumatori. Priorità: ALTA Attori: Service Owner, API Consumer Tracciabilità: glossary "Consumer-Driven Contract", "Ubiquitous Language"; BC-02.

---

BR-007 - Tracciabilità distribuita su ogni richiesta

Codice: BR-007 Nome: Ogni richiesta cross-servizio propaga un trace context Descrizione: Ogni richiesta o messaggio propaga un identificatore di traccia (trace-id, span-id) attraverso i confini di servizio, così che un'operazione end-to-end possa essere ricostruita per debugging e osservabilità. Motivazione: Rendere debuggabile un flusso che attraversa molti servizi. Priorità: MEDIA Attori: Service Mesh, Service Owner Tracciabilità: glossary "Distributed Tracing", "Observability".

---

BR-008 - Confini di servizio allineati ai Bounded Context

Codice: BR-008 Nome: I confini di un Servizio derivano da un Bounded Context del dominio Descrizione: La scomposizione in servizi segue i confini del dominio (DDD), non i livelli tecnici. Ogni servizio incapsula un bounded context con il proprio linguaggio ubiquo, evitando servizi anemici o eccessivamente fini (nano-servizi). Motivazione: Massimizzare la coesione e minimizzare la chattiness inter-servizio. Priorità: ALTA Attori: Service Owner Tracciabilità: glossary "Domain-Driven Design (DDD)", "Bounded Context", "Modular Monolith", "Strangler Fig Pattern"; BC-01.