Skip to content

'O Forno — Architettura dei Nodi

“‘O ffuoco è ‘o masto — nun ce vo’ fretta, ce vo’ rispetto.” — Proverbio napoletano dei pizzaioli

In qualsiasi cucina che si rispetti, il forno è il fulcro di tutto. Nel Pasta Protocol, ‘O Forno rappresenta il layer di elaborazione distribuita: l’insieme dei nodi che compongono il cluster, ciascuno con il proprio ruolo, la propria responsabilità e il proprio calore operativo.

Un nodo del Pasta Protocol non è semplicemente un processo — è un artigiano. Ha una specializzazione, conosce i propri limiti, e quando il forno non funziona, lo dice chiaramente prima di mandare tutto a ‘VESUVIO’.

Le Strutture Fondamentali

Ogni nodo è modellato attraverso tre tipi principali che compongono la gerarchia di elaborazione:

/** Rappresenta una singola unità di lavoro all'interno del cluster */
interface Node {
readonly id: string;
readonly role: NodeRole;
readonly address: NodeAddress;
readonly status: NodeStatus;
readonly joinedAt: Date;
readonly lastHeartbeat: Date;
readonly metadata: Readonly<Record<string, string>>;
}
/** Il Forno è il runtime che ospita uno o più Node */
interface Forno {
readonly nodeId: string;
readonly capacity: number; // numero massimo di "infornate" parallele
readonly temperature: FornoTemp; // FREDDO | TIEPIDO | CALDO | ROVENTE
readonly queue: ReadonlyArray<Impasto>;
start(): Promise<void>;
shutdown(graceful?: boolean): Promise<void>;
enqueue(impasto: Impasto): Promise<EnqueueResult>;
drain(): Promise<void>;
}
/** La Kitchen coordina tutti i Forno del cluster */
interface Kitchen {
readonly id: string;
readonly forni: ReadonlyArray<Forno>;
readonly dispensa: Dispensa;
readonly rete: Rete;
addForno(forno: Forno): Kitchen;
removeForno(nodeId: string): Kitchen;
rebalance(): Promise<RebalanceResult>;
healthCheck(): Promise<KitchenHealth>;
}

Il tipo Impasto rappresenta l’unità di lavoro — analogo a un task o un job nel gergo comune:

interface Impasto {
readonly id: string;
readonly recipeId: string;
readonly payload: Readonly<Record<string, unknown>>;
readonly priority: ImpastoPriority; // SFOGLIA | NORMALE | URGENTE | FUOCO
readonly createdAt: Date;
readonly timeout: number; // in "cotture" (multipli di 30 secondi)
readonly retryPolicy: RetryPolicy;
readonly traceId: string;
}
type ImpastoPriority = 'SFOGLIA' | 'NORMALE' | 'URGENTE' | 'FUOCO';
interface RetryPolicy {
readonly maxAttempts: number;
readonly backoffMultiplier: number;
readonly maxBackoffCotture: number;
}

I Tre Ruoli dei Nodi

Il Pasta Protocol assegna a ogni nodo un ruolo preciso. Come in una cucina ben organizzata, la specializzazione è la chiave dell’efficienza.

Pizzaiolo — Il Worker

Il Pizzaiolo è il cuore operativo del cluster. Riceve gli Impasto, li lavora, li cuoce e restituisce i risultati. Non pensa alla coordinazione globale — pensa a fare bene il suo lavoro, uno alla volta o in parallelo secondo la sua capacità.

interface PizzaioloConfig {
readonly concurrency: number; // quante pizze contemporaneamente
readonly recipeWhitelist?: ReadonlyArray<string>; // solo queste ricette
readonly forno: {
readonly temperature: FornoTemp;
readonly warmupCotture: number;
};
}

Capocuoco — Il Coordinator

Il Capocuoco non lavora direttamente con gli impasti — li smista, li prioritizza, decide quale Pizzaiolo è il più adatto. È responsabile della distribuzione del carico, del consenso distribuito (algoritmo Pesto) e della gestione dei failover.

interface CapocuocoConfig {
readonly quorum: number; // nodi minimi per il consenso Pesto
readonly electionTimeoutCotture: number;
readonly heartbeatIntervalCotture: number;
readonly maxReassignmentsPerCottura: number;
}

Lavapiatti — Il Cleaner

Il Lavapiatti è il nodo che nessuno nota ma che nessuno vuole perdere. Si occupa di garbage collection distribuita, pulizia dei log scaduti, rimozione degli impasti orfani e compattazione dello storage. Opera sempre in background, silenzioso come la notte.

interface LavapiattConfig {
readonly scheduleCron: string; // es. "0 */4 * * *"
readonly retentionPolicy: {
readonly completedImpastiCotture: number;
readonly failedImpastiCotture: number;
readonly orphanedImpastiCotture: number;
};
readonly compactionThresholdMb: number;
}

Confronto tra i Tipi di Nodo

CaratteristicaPizzaiolo (Worker)Capocuoco (Coordinator)Lavapiatti (Cleaner)
Ruolo primarioEsecuzione taskCoordinazione e routingManutenzione cluster
StatoStateless per designStateful (Raft/Pesto)Stateless
ScalabilitàOrizzontale illimitata3 o 5 nodi tipici1 per cluster
Impatto failoverBasso (riassegnazione)Alto (elezione leader)Minimo
Utilizzo CPUAlto durante elaborazioneMedio (coordinazione)Basso (batch notte)
Memoria richiestaMediaAlta (state machine)Bassa
Partecipa al quorumNoNo
/sono-vivo endpoint

Ciclo di Vita di un Nodo

Un nodo del Pasta Protocol attraversa stati ben definiti durante la sua vita:

FREDDO → RISCALDAMENTO → PRONTO → OCCUPATO → RAFFREDDAMENTO → SPENTO
↑ ↓
└──────── ERRORE ←───────┘
(VESUVIO)

La transizione più critica è quella verso ERRORE — lo stato VESUVIO. Quando un nodo entra in questo stato, il Capocuoco avvia automaticamente il protocollo di failover: riassegnazione degli impasti in corso, notifica agli altri nodi del cluster, e tentativo di recupero entro il timeout configurato.

Configurazione del Nodo

I nodi vengono configurati tramite file .ricetta in formato TOML-like:

# mio-nodo.ricetta
[node]
id = "pizzaiolo-napoli-01"
role = "PIZZAIOLO"
address = "10.0.1.42:8080"
[forno]
capacity = 8
temperature = "CALDO"
warmup_cotture = 2
[healthcheck]
endpoint = "/sono-vivo"
interval_cotture = 1
failure_threshold = 3
[logging]
level = "VOCE"
format = "json"

Healthcheck e Monitoraggio

Ogni nodo espone l’endpoint /sono-vivo per il controllo dello stato. La risposta include temperatura del forno, impasti in coda, e lo stato corrente:

interface SonoVivoResponse {
readonly status: 'CALDO' | 'TIEPIDO' | 'FREDDO' | 'VESUVIO';
readonly nodeId: string;
readonly role: NodeRole;
readonly uptime: number; // in cotture
readonly queueDepth: number;
readonly activeImpasti: number;
readonly lastHeartbeat: string; // ISO 8601
}

Dal CLI del framework puoi interrogare lo stato del nodo direttamente:

pasta> node status pizzaiolo-napoli-01
Status: CALDO ✓
Queue: 3 impasti in attesa
Active: 5/8 slot occupati
Uptime: 142 cotture
Heartbeat: 2 cotture fa

‘O forno che lavora bene non fa rumore — lo senti solo quando si ferma.