Skip to main content

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:

ComponenteTecnologiaRuolo
TransporterNATSComunicazione inter-servizio (request/reply, eventi)
CacherRedisCache distribuita per ridurre il carico sul database
SerializerJSONSerializzazione dei messaggi tra servizi
LoggerWinston/PinoLogging strutturato con livelli configurabili
RegistryBuilt-inService 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:

  1. Si registra presso il broker locale
  2. Il broker pubblica la registrazione su NATS
  3. Tutti i nodi della rete ricevono la notifica e aggiornano il registry
  4. 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 cacher
  • REDIS_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

Questa pagina ti è stata utile?