Torna al blog
ArticoloApril 6, 20267 min

Perché la maggior parte dei Data Pipeline falliscono alle 3 del mattino (e come costruirne di resistenti)

Le vere ragioni per cui i data pipeline di produzione si rompono nel cuore della notte — e le pratiche ingegneristiche che lo prevengono

Perché la maggior parte dei Data Pipeline falliscono alle 3 del mattino (e come costruirne di resistenti)

Di Andrew Tan

Le vere ragioni per cui i data pipeline di produzione si interrompono nel cuore della notte — e le pratiche ingegneristiche che lo prevengono


Il cercapersone suona

Sono le 3:17 del mattino. Il tuo telefono vibra sul comodino. Lo cerchi a tentoni, strizzi gli occhi per la luminosità e vedi lo stesso messaggio che hai già visto: "Data pipeline failed. Last successful run: 14 hours ago."

Sai cosa succederà dopo. Passerai le prossime due ore nei thread di Slack, guardando log che non hanno senso, cercando di capire se si tratta dello stesso errore della settimana scorsa o di qualcosa di nuovo. Entro le 6 del mattino, avrai un workaround in esecuzione. Entro le 9 del mattino, dirai al tuo team che è "gestito per ora". E il mese prossimo, farai tutto di nuovo.

Ci sono passato. Più volte di quanto mi piaccia ammettere. E dopo anni di costruzione di infrastrutture dati e di conversazioni con team che hanno attraversato lo stesso ciclo, ho notato qualcosa: i fallimenti delle 3 del mattino non sono casuali. Seguono schemi. E la maggior parte di essi è prevenibile.

Perché proprio alle 3 del mattino?

Non c'è nulla di magico nell'ora. Ma c'è qualcosa di prevedibile nelle condizioni che esistono alle 3 del mattino:

Il fattore umano è al minimo. Gli ingegneri che hanno costruito il pipeline dormono. Gli operatori che conoscono le particolarità sono fuori turno. La conoscenza istituzionale che vive nella testa di qualcuno non è accessibile. Ti rimane la documentazione che era accurata sei mesi fa e un runbook che salta i passaggi che "tutti conoscono".

Il volume dei dati spesso raggiunge il picco. Le basi utenti globali significano che "notte" nel tuo fuso orario è "giorno" da qualche altra parte. Quel fallimento delle 3 del mattino? Probabilmente sta accadendo quando i tuoi utenti asiatici o europei sono più attivi. Il pipeline che gestiva 10.000 eventi al minuto a mezzogiorno sta improvvisamente affogando in 50.000.

Le dipendenze falliscono in catene a cascata. Il tuo pipeline non esiste in isolamento. Si alimenta da database che eseguono le proprie finestre di manutenzione. Scrive su API che hanno limiti di velocità. Dipende da servizi che distribuiscono aggiornamenti durante le ore di bassa attività. Quando un collegamento si rompe alle 3 del mattino, gli effetti a catena colpiscono il tuo pipeline prima che qualcuno sia sveglio per accorgersene.

I lavori batch si accumulano. Quel lavoro ETL delle 2 del mattino funziona bene fino al giorno in cui non lo fa. Forse il sistema sorgente era più lento. Forse il volume dei dati era più alto. Forse un'interruzione della rete ha aggiunto 20 minuti di latenza. Improvvisamente il tuo lavoro delle 2 del mattino è ancora in esecuzione alle 3 del mattino, e il lavoro delle 3 del mattino — quello da cui dipende il tuo dashboard — inizia comunque, creando una condizione di gara che corrompe metà dei tuoi dati.

Il fallimento delle 3 del mattino non è un singolo bug. È l'intersezione di molteplici decisioni progettuali che erano accettabili in isolamento ma catastrofiche insieme.

I cinque schemi che causano la maggior parte dei fallimenti notturni

Dopo aver osservato dozzine di team risolvere questi incidenti, ho identificato cinque schemi ricorrenti:

1. Il fallimento silenzioso

Il lavoro riporta "successo" ma ha prodotto dati spazzatura. Nessun avviso è stato attivato perché il pipeline non è andato in crash — ha semplicemente fatto silenziosamente la cosa sbagliata. Non lo scopri fino a quando qualcuno al mattino chiede perché i numeri di fatturato di ieri sembrano un numero di telefono.

Perché accade di notte: I fallimenti diurni vengono catturati da umani che guardano i dashboard e notano anomalie. I fallimenti notturni aspettano fino al mattino.

La soluzione: Cancelli di validazione. Ogni pipeline dovrebbe avere controlli espliciti di qualità dei dati che falliscono il lavoro se gli output non soddisfano le aspettative. Conteggi delle righe entro intervalli previsti. Tassi di nullità sotto le soglie. Controlli di integrità referenziale. Se i dati sono sbagliati, il pipeline dovrebbe fallire rumorosamente, non avere successo silenziosamente.

2. La scarsità di risorse

Il tuo pipeline ha funzionato bene in staging. Ha funzionato bene per mesi in produzione. Poi un giorno, il volume dei dati ha raggiunto una soglia che non sapevi esistesse, e improvvisamente sei senza memoria, senza disco o senza quota API.

Perché accade di notte: Molti limiti di risorse sono morbidi fino a quando non lo sono più. Le perdite di memoria si accumulano. I file di log crescono. Le tabelle temporanee si riempiono. Il lavoro delle 3 del mattino è quello che finalmente colpisce il muro.

La soluzione: Monitoraggio delle risorse con limiti proattivi. Non monitorare solo se il lavoro è terminato — monitora le tendenze di utilizzo della memoria, le traiettorie dello spazio su disco, il consumo di quota API. Imposta avvisi a soglie del 70%, non al 100%. E progetta per una degradazione graduale: se non puoi elaborare tutto, puoi elaborare il sottoinsieme più importante?

3. Il timeout della dipendenza esterna

Il tuo pipeline chiama un'API. Di solito risponde in 200ms. Stanotte ci sta mettendo 30 secondi. Il tuo timeout predefinito è di 60 secondi, quindi il lavoro non fallisce immediatamente — rallenta solo fino a un punto morto. Quando scade il timeout, sta tenendo bloccate risorse di cui altri lavori hanno bisogno.

Perché accade di notte: I servizi di terze parti fanno manutenzione durante le ore di bassa attività. I percorsi di rete vengono reindirizzati. Il DNS si propaga. L'infrastruttura che non controlli cambia senza preavviso.

La soluzione: Interruttori automatici e timeout sintonizzati sulla realtà. Se il 99% delle chiamate API si completa in meno di 5 secondi, imposta il tuo timeout a 10 secondi, non a 60. Implementa interruttori automatici che falliscono rapidamente quando una dipendenza sta lottando. Progetta la logica di retry con backoff esponenziale, non retry immediati che colpiscono un servizio in difficoltà.

4. La discrepanza di stato

Il tuo pipeline elabora eventi in ordine. Ma stanotte, gli eventi sono arrivati fuori ordine. O sono arrivati eventi duplicati. O gli eventi sono arrivati con timestamp che non hanno senso l'uno rispetto all'altro. La tua aggregazione stateful ha prodotto assurdità perché le assunzioni sull'ordinamento degli eventi sono state violate.

Perché accade di notte: I sistemi distribuiti sono eventualmente consistenti. Le partizioni di rete accadono. Le code di messaggi riordinano sotto carico. Gli invarianti che hai assunto — "gli eventi arrivano in ordine", "gli eventi arrivano esattamente una volta" — sono garanzie che la tua infrastruttura non fornisce effettivamente.

La soluzione: Gestione difensiva dello stato. Usa l'elaborazione basata sul tempo dell'evento, non sul tempo di elaborazione. Gestisci eventi fuori ordine con watermark. Progetta per semantiche almeno una volta e rendi le tue aggregazioni idempotenti. Supponi che gli eventi saranno in ritardo, duplicati o mancanti — e gestiscilo con grazia.

5. La deriva di configurazione

Il pipeline ha funzionato ieri. Nulla è cambiato nel codice. Ma qualcuno ha aggiornato una variabile d'ambiente. O ha ruotato una credenziale. O ha cambiato uno schema di database senza aggiornare il pipeline. Il codice è lo stesso, ma il mondo in cui gira è cambiato.

Perché accade di notte: I cambiamenti infrastrutturali spesso vengono distribuiti durante le finestre di manutenzione. Le migrazioni di schema vengono eseguite durante le ore di bassa attività. Le rotazioni delle credenziali avvengono su programmi. Il lavoro delle 3 del mattino è il primo a incontrare il nuovo mondo.

La soluzione: Configurazione come codice, testata come codice. Ogni variabile d'ambiente, ogni riferimento segreto, ogni assunzione di schema dovrebbe essere controllata in versione e validata. Esegui i pipeline in modalità "dry run" dopo i cambiamenti infrastrutturali. Avvisa sulla deriva di schema. Tratta i cambiamenti di configurazione con la stessa rigore dei cambiamenti di codice.

Il cambiamento di mentalità: da "gestire i fallimenti" a "prevenirli"

La maggior parte dei team di dati che conosco opera in modalità reattiva. Il pipeline fallisce. Lo riparano. Documentano cosa è successo. Vanno avanti. Poi fallisce di nuovo, per una ragione leggermente diversa, e il ciclo si ripete.

I team che non vengono svegliati alle 3 del mattino hanno un approccio diverso. Pensano in termini di domini di fallimento e raggio d'azione. Si chiedono: "Se questo componente fallisce, cos'altro si rompe?" Progettano per una degradazione graduale piuttosto che per una perfetta affidabilità.

Ecco come appare in pratica:

Testare i fallimenti, non solo i percorsi di successo. La tua suite di test dovrebbe includere scenari in cui le dipendenze scadono, i dati sono malformati e le risorse sono esaurite. Se testi solo il percorso felice, non stai testando la produzione.

Osservabilità oltre il monitoraggio. Il monitoraggio ti dice che un lavoro è fallito. L'osservabilità ti dice perché. Investi nel tracing che segue gli eventi attraverso il tuo pipeline. Registra il contesto, non solo gli eventi. Costruisci dashboard che mostrano la salute della qualità dei dati, non solo il completamento del lavoro.

Ingegneria del caos per i data pipeline. Se non hai deliberatamente rotto il tuo pipeline in modo controllato, non sai come fallisce. Esegui esercitazioni in cui interrompi le connessioni al database, introduci latenza e corrompi i dati di input. Impara i tuoi modi di fallimento prima che lo facciano loro.

On-call che si scala a persone che possono risolverlo. La persona che viene svegliata alle 3 del mattino dovrebbe essere qualcuno che può effettivamente risolvere il problema, non solo riavviare il lavoro e sperare. Se la tua rotazione on-call è troppo junior, stai solo ritardando la vera soluzione fino al mattino comunque.

Costruire pipeline che dormono tutta la notte

I data pipeline resilienti condividono tratti comuni. Non sono magici — sono progettati con schemi specifici:

Idempotenza ovunque. Eseguire lo stesso lavoro due volte dovrebbe produrre lo stesso risultato di eseguirlo una volta. Questo rende sicuri i retry e automatico il recupero.

Gestione di backpressure. Quando i sistemi a valle non riescono a tenere il passo, il pipeline dovrebbe rallentare, non andare in crash o perdere dati. Dovrebbe ridurre il carico con grazia, non in modo catastrofico.

Stato limitato. Le operazioni stateful dovrebbero avere limiti. Aggregazioni finestrate con TTL. Archivi di stato con politiche di eliminazione. Non lasciare che uno stato illimitato diventi un problema illimitato.

Contratti espliciti. Definisci e valida gli schemi ai confini del pipeline. Rifiuta i dati malformati presto. Fallisci rapidamente quando le assunzioni vengono violate.

Runbook operativi che funzionano. Ogni avviso dovrebbe avere un runbook. Ogni runbook dovrebbe essere testato. Se il runbook dice "controlla i log", specifica quali log, cosa cercare e cosa fare quando lo trovi.

La conclusione

Il cercapersone delle 3 del mattino non deve essere inevitabile. È un sintomo di scelte progettuali che hanno privilegiato il throughput sulla resilienza, il completamento sulla correttezza e la velocità delle funzionalità sulla maturità operativa.

I team che dormono tutta la notte non sono più fortunati. Hanno investito nel lavoro poco glamour della gestione degli errori, della validazione e dell'osservabilità. Hanno accettato che i fallimenti accadranno e hanno progettato sistemi che li gestiscono con grazia.

I tuoi utenti non si preoccupano se il tuo pipeline era intelligente. Si preoccupano se i dati sono corretti quando ne hanno bisogno. Costruisci per quello.


Cosa fare dopo

Se sei stanco delle chiamate alle 3 del mattino, inizia con un cambiamento: aggiungi un solo cancello di validazione al tuo pipeline più critico. Controlla i conteggi delle righe. Verifica i tassi di nullità. Valida una metrica aziendale chiave. Fai fallire il pipeline se i dati sembrano sbagliati.

Non è una soluzione completa, ma è un inizio. E una volta che avrai provato il sollievo di catturare un problema di qualità dei dati prima che raggiunga i tuoi utenti, sarai motivato ad aggiungere la prossima salvaguardia.

Per team di ingegneria dei dati che costruiscono pipeline di streaming, layline.io fornisce gestione di backpressure integrata, semantiche esattamente una volta e debug visivo che rende più facile capire cosa sta succedendo quando le cose vanno male — sia che sia alle 3 del pomeriggio o alle 3 del mattino. La Community Edition è gratuita da esplorare.

Prova la Community Edition →


Andrew Tan è un imprenditore seriale e fondatore di layline.io, costruendo infrastrutture di elaborazione dati aziendali che gestiscono carichi di lavoro sia batch che in tempo reale su larga scala.

Share:

Enjoyed this article?

Subscribe to get more insights delivered to your inbox.