Architettura Microservizi Moleculer
Panoramica
Il backend della piattaforma Impronto Enterprise si basa su Moleculer.js, un framework per microservizi in Node.js. Ogni servizio e un modulo autonomo che comunica con gli altri tramite un message broker (NATS). Questa architettura consente scaling orizzontale, deploy indipendente dei servizi e isolamento dei guasti.
Componenti del Broker
Il broker Moleculer e il nucleo del sistema. La configurazione risiede in moleculer.config.js e definisce:
| Componente | Tecnologia | Ruolo |
|---|---|---|
| Transporter | NATS | Comunicazione inter-servizio (request/reply, eventi) |
| Cacher | Redis | Cache distribuita per ridurre il carico sul database |
| Serializer | JSON | Serializzazione dei messaggi tra servizi |
| Logger | Winston/Pino | Logging strutturato con livelli configurabili |
| Registry | Built-in | Service discovery automatico via NATS |
Il broker viene avviato tramite moleculer-runner, che carica automaticamente tutti i file che corrispondono al pattern services/**/*.service.js.
Service Discovery
Moleculer implementa service discovery automatico grazie al transporter NATS. Quando un servizio si avvia:
- Si registra presso il broker locale
- Il broker pubblica la registrazione su NATS
- Tutti i nodi della rete ricevono la notifica e aggiornano il registry
- Le chiamate vengono bilanciate automaticamente tra le istanze disponibili
Non e necessaria alcuna configurazione manuale di routing: l'API Gateway scopre automaticamente tutti i servizi e le loro azioni.
Organizzazione dei Servizi
I circa 24 servizi sono organizzati per dominio funzionale:
- Ordini:
ordine.service.js,orders.service.js-- gestione ciclo di vita ordini - Catalogo:
prodotto.service.js,products.service.js-- prodotti e categorie - Clienti:
cliente.service.js-- anagrafica clienti - Sale e tavoli:
tavolo.service.js,sala.service.js-- planimetria e stati tavolo - Prenotazioni:
prenotazione.service.js,bookings.service.js,slot.service.js - Magazzino:
warehouse*.service.js-- inventario, fornitori, ordini fornitore - Cassa:
cash-registers,cash-sessions,cash-movements,cash-reason-codes,cash-reports,cash-alerts - Pagamenti:
pagamento.service.js-- transazioni di pagamento - Stampa:
stampa.service.js-- generazione comandi ESC/POS - Real-time:
mqtt.service.js-- broadcast eventi ai client - Sync:
sync.service.js-- sincronizzazione bidirezionale con le casse - Configurazione:
configurazione.service.js-- impostazioni per tenant
Comunicazione tra Servizi
La comunicazione avviene in due modalita:
Request/Reply
Chiamata sincrona tra servizi tramite ctx.call():
const products = await ctx.call("products.list", { categoryId: "pizze" });
Il broker gestisce il routing, il bilanciamento di carico e il retry automatico.
Eventi
Comunicazione asincrona tramite ctx.emit() o ctx.broadcast():
ctx.emit("order.created", { orderId: order._id });
Gli eventi vengono utilizzati per notifiche, aggiornamento cache e trigger di processi collaterali (es. stampa comanda, aggiornamento magazzino).
Configurazione NATS e Redis
Le connessioni a NATS e Redis sono configurate tramite variabili d'ambiente nel file .env:
NATS_URL: URL del server NATS (es.nats://localhost:4222)REDIS_HOST,REDIS_PORT,REDIS_PASSWORD: configurazione Redis per il cacherREDIS_TTL: tempo di vita default della cache (in secondi)
FAQ
D: Come aggiungo un nuovo microservizio?
R: Creare un file services/mioservizio.service.js con il mixin TenantDbMixin. Il broker lo carica automaticamente al riavvio tramite il pattern glob di moleculer-runner.
D: Come gestisco il fallimento di un servizio? R: Moleculer implementa circuit breaker, retry e timeout configurabili. Se un servizio non risponde, le richieste vengono automaticamente reindirizzate ad altre istanze disponibili.
D: Come monitoro lo stato dei servizi?
R: Il comando npm run cli apre la console Moleculer REPL, dove e possibile ispezionare nodi, servizi, azioni ed eventi registrati.
Vedi Anche
- Multi-Tenancy -- Isolamento dati per tenant
- API Gateway -- Routing e autenticazione
- Mixin Database -- Pattern di accesso al database
- Panoramica Architettura -- Visione d'insieme della piattaforma