Flussi di dati con Pub/Sub

Questa pagina fornisce una panoramica concettuale dell'integrazione di Dataflow con Pub/Sub. La panoramica descrive alcune ottimizzazioni disponibili nell'implementazione dell'esecutore di Dataflow del connettore I/O Pub/Sub. Pub/Sub è un sistema di importazione e distribuzione di eventi scalabile e durevole. Dataflow integra il modello di consegna scalabile "at-least-once" di Pub/Sub con la deduplicazione dei messaggi, l'elaborazione "exactly-once" e la generazione di una filigrana di dati da eventi con timestamp. Per utilizzare Dataflow, scrivi la pipeline utilizzando l'SDK Apache Beam, quindi esegui il codice della pipeline sul servizio Dataflow.

Prima di iniziare, scopri i concetti di base di Apache Beam e delle pipeline di flusso. Per ulteriori informazioni, consulta le seguenti risorse:

Creazione di pipeline in modalità flusso con Pub/Sub

Per sfruttare i vantaggi dell'integrazione di Dataflow con Pub/Sub, puoi creare le tue pipeline in modalità flusso in uno dei seguenti modi:

Funzionalità di integrazione di Pub/Sub e Dataflow

Apache Beam fornisce un'implementazione di riferimento dell'origine I/O (PubsubIO) per Pub/Sub (Java, Python e Go). Questa implementazione dell'origine I/O è utilizzata da runner non Dataflow, come l'esecutore Apache Spark, l'esecutore Apache Flink e quello diretto.

L'esecutore di Dataflow utilizza un'implementazione privata diversa di PubsubIO (per Java, Python e Go). Questa implementazione sfrutta le API e i servizi interni di Google Cloud per offrire tre vantaggi principali: filigrane a bassa latenza, precisione elevata della filigrana (e quindi completezza dei dati) e deduplicazione efficiente (elaborazione dei messaggi "exactly-once").

I connettori I/O Apache Beam ti consentono di interagire con Dataflow utilizzando origini e sink controllati. L'implementazione PubsubIO dell'esecutore Dataflow riconosce automaticamente i messaggi dopo che sono stati elaborati correttamente dalla prima fase e gli effetti collaterali dell'elaborazione vengono scritti nello spazio di archiviazione permanente. Per ulteriori dettagli, consulta la documentazione di Fusion. I messaggi vengono pertanto confermati solo quando Dataflow può garantire che non si verifichi alcuna perdita di dati in caso di arresto anomalo di alcuni componenti o della perdita di una connessione.

Filigrane a bassa latenza

Dataflow ha accesso all'API privata di Pub/Sub, che fornisce l'età del messaggio non confermato meno recente in una sottoscrizione, con una latenza inferiore rispetto a quella disponibile in Cloud Monitoring. Per fare un confronto, le metriche del backlog di Pub/Sub disponibili in Cloud Monitoring presentano in genere un ritardo di 2-3 minuti, ma per Dataflow vengono ritardate solo di circa dieci secondi. In questo modo, Dataflow può far progredire le filigrane delle pipeline ed emettere più rapidamente risultati di calcolo basati su finestre.

Elevata precisione della filigrana

Un altro importante problema risolto in modo nativo dall'integrazione di Dataflow con Pub/Sub è la necessità di una filigrana solida per le finestre definite nell'ora dell'evento. L'ora dell'evento è un timestamp specificato dall'applicazione del publisher come attributo di un messaggio Pub/Sub, anziché il campo publish_time impostato su un messaggio dal servizio Pub/Sub stesso. Poiché Pub/Sub calcola le statistiche del backlog solo in relazione ai timestamp assegnati dal servizio (o del tempo di elaborazione), la stima della filigrana dell'ora dell'evento richiede un meccanismo separato.

Per risolvere il problema, se l'utente sceglie di utilizzare timestamp degli eventi personalizzati, il servizio Dataflow crea un secondo abbonamento di monitoraggio. Questa sottoscrizione di monitoraggio viene utilizzata per esaminare gli orari degli eventi dei messaggi nel backlog della sottoscrizione di base e stimare il backlog dell'ora dell'evento. Per ulteriori informazioni, consulta la pagina di StackOverflow relativa al modo in cui Dataflow calcola le filigrane Pub/Sub.

Deduplicazione efficiente

La deduplicazione dei messaggi è necessaria per l'elaborazione "exactly-once" dei messaggi. Inoltre, puoi utilizzare il modello di programmazione Apache Beam per ottenere l'elaborazione "exactly-once" dei flussi di messaggi Pub/Sub. Dataflow deduplica i messaggi rispetto all'ID messaggio Pub/Sub. Di conseguenza, tutta la logica di elaborazione può presupporre che i messaggi siano già univoci rispetto all'ID messaggio Pub/Sub. Il meccanismo di aggregazione efficiente e incrementale per raggiungere questo obiettivo è astratto nell'API PubsubIO.

Se PubsubIO è configurato per utilizzare l'attributo del messaggio Pub/Sub per la deduplicazione anziché l'ID messaggio, Dataflow deduplica i messaggi pubblicati in Pub/Sub entro 10 minuti l'uno dall'altro.

Funzionalità di Pub/Sub non supportate

Le seguenti funzionalità Pub/Sub non sono supportate nell'implementazione del connettore I/O Pub/Sub da parte dell'esecutore Dataflow.

Argomenti non recapitabili e criteri per la ripetizione dei tentativi di ritardo di backoff esponenziale

Gli argomenti messaggi non recapitabili Pub/Sub e i criteri per i tentativi di ritardo di backoff esponenziale non sono completamente supportati da Dataflow. Implementa invece questi pattern in modo esplicito all'interno della pipeline. Due esempi di pattern di messaggi non recapitabili sono forniti nell'applicazione di retail e nel modello da Pub/Sub a BigQuery.

Gli argomenti messaggi non recapitabili e i criteri relativi ai nuovi tentativi di ritardo di backoff esponenziale non funzionano con Dataflow per due motivi.

Innanzitutto, Dataflow non invia messaggi NACK (ovvero, invia un riconoscimento negativo) a Pub/Sub in caso di errore del codice della pipeline. Dataflow riprova invece a elaborare il messaggio a tempo indeterminato, prorogando continuamente la scadenza di conferma del messaggio. Tuttavia, il backend Dataflow potrebbe NACK di messaggi per vari motivi interni, quindi è possibile che i messaggi vengano recapitati all'argomento messaggi non recapitabili anche se non si sono verificati errori nel codice della pipeline.

In secondo luogo, Dataflow può confermare i messaggi prima che la pipeline li elabori. In particolare, Dataflow riconosce i messaggi dopo che sono stati elaborati correttamente dalla prima fase e gli effetti collaterali dell'elaborazione sono stati scritti nello spazio di archiviazione permanente. Se la pipeline ha più fasi fusibili e si verificano errori in qualsiasi momento dopo la prima fase, i messaggi sono già confermati.

Distribuzione "exactly-once" di Pub/Sub

Poiché Dataflow ha la propria elaborazione "exactly-once, l'uso della distribuzione "exactly-once" di Pub/Sub con Dataflow non è consigliabile. L'abilitazione della consegna "exactly-once" di Pub/Sub riduce le prestazioni della pipeline, poiché limita i messaggi disponibili per l'elaborazione parallela.

Ordine dei messaggi Pub/Sub

Quando l'ordinamento dei messaggi Pub/Sub è abilitato, Dataflow potrebbe riordinare i messaggi. La pipeline viene eseguita, ma non è garantito che i messaggi arrivino nell'ordine in cui Dataflow li riceve. Tuttavia, quando utilizzi Pub/Sub con Dataflow, abilitare l'ordinamento dei messaggi può aumentare la latenza e diminuire le prestazioni.

Utilizzo di Pub/Sub Seek con Dataflow

Pub/Sub Seek consente agli utenti di riprodurre i messaggi confermati in precedenza. Puoi usare Pub/Sub Seek con Dataflow per rielaborare i messaggi in una pipeline.

Tuttavia, non è consigliabile utilizzare Pub/Sub Seek in una pipeline in esecuzione. Un tentativo a ritroso in una pipeline in esecuzione può comportare la perdita di messaggi o messaggi duplicati. Inoltre, rende non valida la logica della filigrana di Dataflow e crea conflitti con lo stato di una pipeline che incorpora dati elaborati.

Per rielaborare i messaggi utilizzando Pub/Sub Seek, è consigliabile eseguire il seguente flusso di lavoro:

  1. Crea un'istantanea della sottoscrizione.
  2. Creare una nuova sottoscrizione per l'argomento Pub/Sub. Il nuovo abbonamento eredita lo snapshot.
  3. Svuota o annulla il job Dataflow attuale.
  4. Invia nuovamente la pipeline utilizzando il nuovo abbonamento.

Per maggiori informazioni, consulta Rielaborazione dei messaggi con lo snapshot Pub/Sub e la ricerca.

Passaggi successivi