DEV Community

Cover image for Pipeline Architecture: dati che fluiscono attraverso filtri
Dev-Iadicola
Dev-Iadicola

Posted on • Originally published at iadicola.it

Pipeline Architecture: dati che fluiscono attraverso filtri

L'idea: dati in ingresso, trasformazioni in sequenza, risultato in uscita

Un'immagine caricata dall'utente deve essere: validata (dimensioni, formato), ridimensionata, compressa, convertita in WebP, caricata su CDN, e il suo URL salvato nel database. Ogni passaggio e indipendente e potrebbe essere riordinato, rimosso o aggiunto senza influenzare gli altri. Questa catena di trasformazioni e una pipeline.

La Pipeline Architecture (o Pipes and Filters) organizza il processing come una sequenza di filtri collegati da pipe. Ogni filtro riceve un input, lo trasforma, e produce un output che diventa l'input del filtro successivo. I filtri non si conoscono tra loro — conoscono solo il formato dei dati che ricevono e producono.

Struttura: Pipe, Filter, Source, Sink

  • Source: il punto di ingresso dei dati (upload dell'utente, file CSV, request HTTP)
  • Filter: un componente che trasforma i dati. Ha un input e un output. Non ha stato condiviso con altri filtri.
  • Pipe: il connettore tra due filtri. Passa l'output di un filtro come input del successivo.
  • Sink: il punto di uscita (database, file, response HTTP)

Pipeline Architecture in PHP: il middleware

Il caso più evidente di Pipeline in PHP e il middleware HTTP. Ogni middleware e un filtro che riceve la request, la può modificare, la passa al filtro successivo, e può modificare la response al ritorno:

  • CsrfMiddleware: verifica il token CSRF. Se invalido, blocca. Se valido, passa al prossimo.
  • AuthMiddleware: verifica l'autenticazione. Aggiunge l'utente alla request.
  • RateLimitMiddleware: verifica il rate limit. Se superato, risponde 429.
  • CorsMiddleware: aggiunge gli header CORS alla response.

In Soft PHP MVC, il MiddlewarePipeline e un'implementazione pura della Pipeline Architecture: ogni middleware implementa la stessa interfaccia, viene eseguito in sequenza, e può interrompere la catena o modificare i dati che attraversano.

Esempio teorico: ETL (Extract-Transform-Load)

Un import di dati da un file CSV al database e una pipeline naturale:

  • Extract: legge il CSV riga per riga (generator PHP per memoria costante)
  • Validate: scarta le righe con dati invalidi, logga gli errori
  • Normalize: converte date, normalizza nomi, pulisce spazi
  • Deduplicate: rimuove duplicati per chiave unica
  • Enrich: aggiunge dati da API esterne (geocoding, validazione email)
  • Transform: mappa i campi CSV nei campi del database
  • Load: inserisce nel database in batch da 500

Ogni filtro e una classe indipendente, testabile e riutilizzabile. Puoi riordinare i filtri, aggiungerne di nuovi, o rimuoverne senza toccare gli altri.

Pipeline con Generator PHP

I generator PHP sono lo strumento ideale per implementare pipeline lazy:

$result = load(transform(enrich(deduplicate(normalize(validate(extract('data.csv')))))));

Ogni funzione e un generator che yielda i risultati uno alla volta. L'intera pipeline processa un record alla volta con memoria costante, indipendentemente dalla dimensione del file.

Quando usare la Pipeline Architecture

  • Usa Pipeline per processing sequenziale di dati: ETL, image processing, log parsing
  • Usa Pipeline per middleware HTTP: ogni step aggiunge o verifica qualcosa
  • Usa Pipeline quando i passaggi sono indipendenti e potenzialmente riordinabili
  • Non usare Pipeline quando i passaggi hanno dipendenze complesse tra loro e l'ordine e rigido
  • Non usare Pipeline per flussi con branching complesso: un albero di decisioni non e una pipeline

La Pipeline Architecture e la più antica e la più elegante: e la filosofia Unix applicata al software. Ogni filtro fa una cosa sola e la fa bene. Collegati insieme, risolvono problemi complessi con componenti semplici.


👉 Leggi l'articolo completo su iadicola.it

Top comments (0)