Lettura da Pub/Sub a Dataflow

Questa pagina descrive le best practice per la lettura da Pub/Sub in Dataflow.

Apache Beam fornisce un'implementazione di riferimento del connettore I/O Pub/Sub per l'utilizzo da parte di runner non Dataflow. Tuttavia, l'esecutore Dataflow utilizza la propria implementazione personalizzata del connettore. Questa implementazione sfrutta le API e i servizi interni di Google Cloud per offrire filigrane a bassa latenza, elevata precisione della filigrana e deduplicazione efficiente per l'elaborazione dei messaggi "exactly-once". Il connettore è disponibile per Java, Python e Go.

Elaborazione "exactly-once"

Pub/Sub disaccoppia i publisher di eventi dai consumer di eventi. L'applicazione pubblica messaggi in un argomento e Pub/Sub li recapita in modo asincrono ai sottoscrittori.

Pub/Sub assegna un ID messaggio univoco a ogni messaggio che è stato pubblicato correttamente in un argomento. Per impostazione predefinita, Pub/Sub esegue la consegna dei messaggi at-least-once. Per raggiungere la semantica "at-least-once", Pub/Sub riprova la consegna se non riceve una conferma dal sottoscrittore entro la scadenza della conferma. I nuovi tentativi possono comportare la consegna di un messaggio più volte. Ad esempio, può verificarsi una nuova pubblicazione se l'abbonato conferma dopo la scadenza o se la conferma viene persa a causa di problemi di rete temporanei.

Se esegui la pipeline Dataflow utilizzando la modalità di flusso "exactly-once", Dataflow deduplica i messaggi per ottenere la semantica "exactly-once". Se la tua pipeline può tollerare alcuni record duplicati, valuta la possibilità di utilizzare invece la modalità flusso at-least-once. Questa modalità può ridurre significativamente la latenza e il costo totale della pipeline. Il compromesso è che alcuni messaggi potrebbero essere elaborati due volte. Per ulteriori informazioni, consulta la sezione Scegliere la modalità di streaming da utilizzare.

Deduplica in base all'attributo del messaggio

Per impostazione predefinita, Dataflow esegue la deduplicazione in base all'ID messaggio. Tuttavia, un'applicazione potrebbe inviare lo stesso record il doppio di due messaggi Pub/Sub distinti. Ad esempio, i dati di origine originali potrebbero contenere record duplicati o l'applicazione potrebbe pubblicare erroneamente lo stesso messaggio due volte. La seconda situazione può verificarsi a causa di nuovi tentativi, se la conferma è stata interrotta a causa di problemi di rete o altre interruzioni. In questi casi, i messaggi duplicati hanno ID messaggio diversi.

A seconda dello scenario, i dati potrebbero contenere un campo univoco che può essere utilizzato per la deduplicazione. Ad esempio, i record potrebbero contenere un ID transazione univoco. Puoi configurare il connettore I/O Pub/Sub per deduplicare i messaggi in base al valore di un attributo del messaggio, anziché utilizzare l'ID messaggio Pub/Sub. Se il publisher imposta questo attributo in modo coerente durante i nuovi tentativi, Dataflow è in grado di rilevare i duplicati. Per la deduplicazione, i messaggi devono essere pubblicati in Pub/Sub entro 10 minuti l'uno dall'altro.

Per ulteriori informazioni sull'utilizzo degli attributi ID, consulta i seguenti argomenti di riferimento dell'SDK:

Abbonamenti

Quando configuri la pipeline, specifichi un argomento Pub/Sub o una sottoscrizione Pub/Sub da cui leggere. Se specifichi una sottoscrizione, non utilizzare la stessa sottoscrizione Pub/Sub per più pipeline. Se due pipeline leggono da una singola sottoscrizione, ogni pipeline riceve parte dei dati in modo non deterministico, il che potrebbe causare messaggi duplicati, ritardo della filigrana e scalabilità automatica inefficiente. Crea invece una sottoscrizione separata per ogni pipeline.

Se specifichi un argomento, il connettore crea una nuova sottoscrizione temporanea. Questo abbonamento è univoco per pipeline.

Timestamp e filigrane

Tutti i messaggi Pub/Sub hanno un timestamp, che rappresenta il momento in cui Pub/Sub riceve il messaggio. I dati potrebbero anche avere un timestamp evento, ovvero l'ora in cui il record è stato generato dall'origine.

Puoi configurare il connettore in modo che legga il timestamp dell'evento da un attributo nel messaggio Pub/Sub. In questo caso, il connettore utilizza il timestamp dell'evento per il watermark. In caso contrario, per impostazione predefinita viene utilizzato il timestamp del messaggio Pub/Sub.

Per saperne di più sull'utilizzo dei timestamp degli eventi, consulta i seguenti argomenti di riferimento degli SDK:

Il connettore Pub/Sub ha accesso all'API privata di Pub/Sub che fornisce l'età del messaggio non confermato meno recente in una sottoscrizione. Questa API offre una latenza inferiore rispetto a quella disponibile in Cloud Monitoring. Consente a Dataflow di migliorare le filigrane delle pipeline ed emettere risultati di calcolo in finestre con latenze basse.

Se configuri il connettore in modo che utilizzi i timestamp degli eventi, Dataflow crea una seconda sottoscrizione Pub/Sub. Utilizza questa sottoscrizione per ispezionare gli orari degli eventi dei messaggi ancora in backlog. Questo approccio consente a Dataflow di stimare con precisione il backlog tempo dell'evento. Per ulteriori informazioni, consulta la pagina di StackOverflow che spiega come Dataflow calcola le filigrane Pub/Sub.

Ricerca Pub/Sub

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.

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.

Backoff esponenziale

Quando crei una sottoscrizione Pub/Sub, puoi configurarla in modo che utilizzi un criterio di backoff esponenziale per i nuovi tentativi. Tuttavia, il backoff esponenziale non funziona con Dataflow.

Il backoff esponenziale viene attivato da una conferma negativa o alla scadenza della scadenza della conferma. Tuttavia, Dataflow non invia conferme negative quando il codice della pipeline non funziona. Prova invece a ripetere l'elaborazione del messaggio a tempo indeterminato, prorogando continuamente la scadenza di conferma del messaggio.

Argomenti non recapitabili

Non è consigliabile utilizzare argomenti messaggi non recapitabili Pub/Sub con Dataflow per i seguenti motivi:

  • Dataflow invia conferme negative per vari motivi interni (ad esempio, l'arresto di un worker). Di conseguenza, i messaggi potrebbero essere recapitati all'argomento messaggi non recapitabili anche se non si verificano errori nel codice della pipeline.

  • Dataflow potrebbe confermare l'invio dei messaggi prima che la pipeline elabora completamente i dati. In particolare, Dataflow riconosce i messaggi dopo che sono stati elaborati correttamente dalla prima fase unita e dopo che gli effetti collaterali dell'elaborazione sono stati scritti nell'archiviazione permanente. Se la pipeline ha più fasi fuse e in qualsiasi momento dopo la prima fase si verificano errori, i messaggi vengono già confermati e non vengono indirizzati all'argomento messaggi non recapitabili.

Implementa invece esplicitamente il pattern messaggi non recapitabili nella pipeline. Alcuni sink di I/O hanno il supporto integrato per le code ai messaggi non recapitabili. I seguenti esempi implementano pattern messaggi non recapitabili;

Distribuzione "exactly-once" di Pub/Sub

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

Ordine dei messaggi Pub/Sub

L'ordinamento dei messaggi è una funzionalità di Pub/Sub che consente a un sottoscrittore di ricevere i messaggi nell'ordine in cui sono stati pubblicati.

Non è consigliabile utilizzare l'ordinamento dei messaggi con Dataflow per i seguenti motivi:

  • Il connettore I/O Pub/Sub potrebbe non mantenere l'ordine dei messaggi.
  • Apache Beam non definisce linee guida rigide sull'ordine in cui vengono elaborati gli elementi. Pertanto, l'ordinamento potrebbe non essere conservato nelle trasformazioni downstream.
  • L'ordinamento dei messaggi Pub/Sub con Dataflow può aumentare la latenza e ridurre le prestazioni.

Passaggi successivi