Panoramica delle modifiche in tempo reale

Un flusso di modifiche monitora ed esegue il flusso delle modifiche ai dati di un database Spanner (inserimento, aggiornamento ed eliminazione) quasi in tempo reale.

Questa pagina offre una panoramica generale dei flussi di modifiche di Spanner: cosa fanno e come funzionano. Per scoprire come creare e gestire modifiche in tempo reale nel tuo database e connetterli ad altri servizi, segui i link nella sezione Passaggi successivi.

Scopo delle modifiche in tempo reale

Le modifiche in tempo reale forniscono un modo flessibile e scalabile per trasmettere le modifiche ai dati in altri servizi. I casi d'uso comuni includono:

  • Replica delle modifiche ai dati Spanner in un data warehouse, ad esempio BigQuery, per l'analisi.

  • Attivazione della logica dell'applicazione in base alle modifiche ai dati inviate a una coda di messaggi, ad esempio Pub/Sub.

  • Archiviazione delle modifiche ai dati in Cloud Storage, a fini di conformità o di archiviazione.

Configurazione delle modifiche in tempo reale

Spanner tratta modifiche in tempo reale come oggetti schema, in modo molto simile a tabelle e indici. Di conseguenza, puoi creare, modificare ed eliminare i flussi di modifiche utilizzando le istruzioni DDL e puoi visualizzare i flussi di modifiche di un database esattamente come gli altri oggetti schema gestiti da DDL.

Puoi configurare un flusso di modifiche per osservare le modifiche ai dati di un intero database oppure limitare il relativo ambito a tabelle e colonne specifiche. Un database può avere più modifiche in tempo reale e una determinata tabella o colonna può avere più flussi che la monitorano, entro i limiti.

Puoi anche configurare un flusso di modifiche per specificare un periodo di conservazione dei dati, un tipo di acquisizione dei valori, un filtro delle eliminazioni basate su TTL o un filtro per le modifiche alle tabelle.

L'emissione del DDL che crea un flusso di modifiche avvia un'operazione a lunga esecuzione. Una volta completato, il nuovo flusso di modifiche inizia immediatamente a controllare le tabelle e le colonne assegnate.

Visualizzazione implicita di tabelle e colonne

Le modifiche in tempo reale che monitorano un'intera tabella osservano implicitamente tutte le colonne in quella tabella, anche quando la definizione della tabella viene aggiornata. Ad esempio, quando aggiungi nuove colonne a quella tabella, la modifica in tempo reale inizia automaticamente a osservare le nuove colonne, senza richiedere modifiche alla configurazione della modifica in tempo reale. Allo stesso modo, il flusso di modifiche interrompe automaticamente la visualizzazione delle colonne eliminate da quella tabella.

Le modifiche in tempo reale dell'intero database funzionano allo stesso modo. Controllano implicitamente ogni colonna di ogni tabella, esaminando automaticamente le tabelle o le colonne aggiunte dopo la creazione del flusso di modifiche e interrompendo la visualizzazione delle tabelle o delle colonne eliminate.

Visualizzazione esplicita di tabelle e colonne

Se configuri un flusso di modifiche per osservare solo determinate colonne di una tabella e in seguito aggiungi colonne alla tabella, il flusso di modifiche non inizierà a monitorare quelle colonne a meno che non riconfiguri il flusso di modifiche per farlo.

Lo schema del database considera i modifiche in tempo reale come oggetti dipendenti di qualsiasi colonna o tabella visualizzata in modo esplicito. Prima di eliminare colonne o tabelle di questo tipo, devi rimuoverle manualmente dalla configurazione di qualsiasi flusso di modifiche che la guarda esplicitamente.

Tipi di modifiche ai dati che modifiche in tempo reale osservati

Le modifiche ai dati monitorate da un flusso di modifiche includono tutti gli inserimento, gli aggiornamenti e le eliminazioni apportate alle tabelle e alle colonne monitorate. Queste modifiche possono provenire da:

Le modifiche in tempo reale possono osservare le modifiche ai dati solo nelle colonne e nelle tabelle create dall'utente. Non controllano indici, visualizzazioni, altri modifiche in tempo reale o tabelle di sistema come tabelle di informazioni o statistiche. I flussi di modifiche non monitorano le colonne generate, a meno che la colonna non faccia parte della chiave primaria. Le colonne delle chiavi primarie vengono sempre monitorate.

Inoltre, le modifiche in tempo reale non monitorano le modifiche allo schema o eventuali modifiche ai dati derivanti direttamente dalle modifiche allo schema. Ad esempio, un flusso di modifiche che osserva un intero database non considera l'eliminazione di una tabella come una modifica dei dati, anche se questa azione rimuove tutti i dati della tabella dal database.

In che modo Spanner scrive e archivia i modifiche in tempo reale

Ogni volta che Spanner rileva una modifica ai dati in una colonna controllata da un flusso di modifiche, scrive un record di modifica dei dati nella sua memoria interna. Lo fa in modo sincrono con la modifica dei dati, all'interno della stessa transazione. Spanner posiziona entrambe le scritture in modo che vengano elaborate dallo stesso server, riducendo al minimo l'elaborazione della scrittura.

Contenuto di un record di modifica dei dati

Ogni record di modifica dei dati scritto da un flusso di modifiche include le seguenti informazioni sulla modifica dei dati:

  • Il nome della tabella interessata

  • I nomi, i valori e i tipi di dati delle chiavi primarie che identificano la riga modificata

  • I nomi e i tipi di dati delle colonne della riga modificata che sono stati acquisiti in base alla definizione della modifica in tempo reale.

  • I valori precedenti delle colonne della riga. La disponibilità dei valori precedenti e i contenuti che monitorano, che possono essere solo le colonne modificate o l'intera riga monitorata, dipendono dal tipo di acquisizione dei valori configurato dall'utente.

  • I nuovi valori delle colonne della riga. La disponibilità dei nuovi valori e i contenuti che monitorano dipendono dal tipo di acquisizione del valore configurato dall'utente.

  • Il tipo di modifica (inserisci, aggiorna o elimina)

  • Timestamp del commit

  • L'ID transazione

  • Il numero di sequenza di record

  • Il tipo di acquisizione del valore del record di modifica dei dati.

Per un approfondimento sulla struttura dei record delle modifiche ai dati, consulta Record delle modifiche dei dati.

Conservazione dei dati

Una modifica in tempo reale conserva i record delle modifiche dei dati per un periodo di tempo compreso tra uno e sette giorni. Puoi utilizzare il DDL per specificare un limite di conservazione dei dati diverso da quello predefinito di un giorno durante la creazione iniziale di un flusso di modifiche oppure modificarlo in qualsiasi momento futuro. Tieni presente che, riducendo il limite di conservazione dei dati di un flusso di modifiche, tutti i dati delle modifiche storiche precedenti al nuovo limite verranno immediatamente e definitivamente non disponibili per i lettori di quel flusso di modifiche.

Questo periodo di conservazione dei dati presenta un compromesso: un periodo di conservazione più lungo comporta una maggiore quantità di spazio di archiviazione nel database del flusso.

Tipo di acquisizione valore

L'opzione di configurazione del tipo di acquisizione del valore di un flusso di modifiche controlla il modo in cui archivia i valori di una riga modificata. Puoi utilizzare il codice DDL per specificare uno dei seguenti tipi di acquisizione dei valori per una modifica in tempo reale:

  • OLD_AND_NEW_VALUES: acquisisce i valori vecchi e nuovi delle colonne modificate di una riga.

  • NEW_VALUES: acquisisce solo i nuovi valori delle colonne non chiave, ma non i valori precedenti.

  • NEW_ROW: acquisisce tutti i nuovi valori delle colonne monitorate, sia modificate che non modificate, ogni volta che viene modificata una di queste colonne. Non viene acquisito nessun valore precedente.

  • NEW_ROW_AND_OLD_VALUES: acquisisce tutti i nuovi valori per le colonne modificate e non modificate, nonché i valori precedenti per le colonne modificate.

Escludi le eliminazioni basate sulla durata

In Spanner, Durata (TTL) consente di impostare criteri per eliminare periodicamente i dati dalle tabelle Spanner. Per impostazione predefinita, le modifiche in tempo reale includono tutte le eliminazioni basate su TTL. Puoi usare exclude_ttl_deletes per impostare il flusso di modifiche in modo da escludere le eliminazioni basate su TTL. Quando imposti questo filtro in modo da escludere le eliminazioni basate su TTL, solo le eliminazioni future basate su TTL vengono escluse dal flusso di modifiche.

Il valore predefinito di questo filtro è false. Per escludere le eliminazioni basate su TTL, imposta il filtro su true. Puoi aggiungere il filtro quando crei un flusso di modifiche o modificare un flusso di modifiche esistente per includere il filtro.

Tipo di modifica della tabella

Per impostazione predefinita, i modifiche in tempo reale includono tutte le modifiche alla tabella, come inserti, aggiornamenti ed eliminazioni. Puoi filtrare una o più di queste modifiche alla tabella dall'ambito del flusso di modifiche utilizzando le seguenti opzioni di filtro disponibili:

  • exclude_insert: escludi tutte le modifiche alla tabella INSERT
  • exclude_update: escludi tutte le modifiche alla tabella UPDATE
  • exclude_delete: escludi tutte le modifiche alla tabella DELETE

Il valore predefinito di questi filtri è false. Per escludere un tipo specifico di modifica della tabella, imposta il filtro su true. Puoi impostare uno o più filtri contemporaneamente.

Puoi aggiungere un filtro per un tipo di modifica della tabella quando crei una modifica in tempo reale o modifichi il filtro per un tipo di modifica della tabella per un flusso di modifiche esistente.

Lettura delle modifiche in tempo reale

Spanner offre diversi modi per leggere i dati di un flusso di modifiche:

  • Tramite Dataflow, utilizzando il connettore SpannerIO di Apache Beam. Questa è la soluzione consigliata per la maggior parte delle applicazioni con modifiche in tempo reale. Google fornisce inoltre modelli Dataflow per casi d'uso comuni.

  • Direttamente, tramite l'API Spanner. Questo sottrae l'astrazione e le funzionalità delle pipeline Dataflow per la massima velocità e flessibilità.

  • Tramite l'utilizzo del connettore Kafka basato su Debezium per modifiche in tempo reale di Spanner. Questo connettore trasmette i flussi di record delle modifiche direttamente negli argomenti Kafka.

Puoi fornire un isolamento parziale per le letture delle modifiche in tempo reale utilizzando le letture dirette. Le letture indirizzate possono aiutare a ridurre al minimo l'impatto sui carichi di lavoro transazionali nel tuo database. Puoi utilizzare l'API Spanner per instradare le letture dei flussi di modifiche a un tipo di replica o a una regione specifici all'interno di una configurazione di istanza per più regioni o di una configurazione regionale personalizzata con regioni o regioni di sola lettura facoltative. Per maggiori informazioni, consulta la pagina relativa alle letture dirette.

Utilizzo di Dataflow

Utilizza il connettore SpannerIO Apache Beam per creare pipeline Dataflow che leggono dai modifiche in tempo reale. Dopo aver configurato il connettore con i dettagli relativi a un determinato flusso di modifiche, vengono generati automaticamente nuovi record di modifiche ai dati in un singolo set di dati PCollection illimitato, pronto per l'elaborazione a seguito di trasformazioni successive nella pipeline Dataflow.

Dataflow utilizza le funzioni di windowing per suddividere le raccolte illimitate in finestre o componenti logici. Di conseguenza, Dataflow offre flussi quasi in tempo reale, con una latenza di circa sei secondi durante la lettura dai modifiche in tempo reale.

Google fornisce modelli che consentono di creare rapidamente pipeline Dataflow per i casi d'uso comuni di modifiche in tempo reale, tra cui l'invio di tutte le modifiche ai dati di un flusso a un set di dati BigQuery o la copia in un bucket Cloud Storage.

Per una panoramica più dettagliata sull'interazione tra modifiche in tempo reale e Dataflow, consulta Creare connessioni con modifiche in tempo reale con Dataflow.

Utilizzo dell'API

In alternativa all'utilizzo di Dataflow per creare pipeline di flusso di modifiche, puoi scrivere codice che utilizzi l'API Spanner per leggere direttamente i record di un flusso di modifiche. Ciò ti consente di leggere i record delle modifiche ai dati nello stesso modo in cui fa il connettore Spanner, scambiando l'astrazione che fornisce in cambio delle latenze più basse possibili durante la lettura dei dati delle modifiche in tempo reale.

Per scoprire di più, consulta Query di modifiche in tempo reale. Per una discussione più dettagliata su come eseguire query su modifiche in tempo reale e interpretare i record restituiti, consulta Modificare le partizioni, i record e le query dei flussi.

Utilizzo del connettore Kafka

Il connettore Kafka genera direttamente i record di modifiche in tempo reale in un argomento Kafka. Astrae i dettagli dell'esecuzione di query sui modifiche in tempo reale utilizzando l'API Spanner.

Per scoprire di più sull'interazione tra le modifiche in tempo reale e il connettore Kafka, consulta Creare connessioni con le modifiche in tempo reale con il connettore Kafka.

Limiti

Esistono diversi limiti per le modifiche in tempo reale, compreso il numero massimo di flussi di modifiche che un database può avere e il numero massimo di flussi di dati che possono essere monitorati da una singola colonna. Per un elenco completo, consulta Modificare i limiti di stream.

Autorizzazioni

Le modifiche in tempo reale utilizzano quanto segue:

  • Per creare, aggiornare o eliminare le modifiche in tempo reale è necessario spanner.databases.updateDdl.

  • La lettura dei dati di una modifica in tempo reale richiede spanner.databases.select.

Se utilizzi il connettore SpannerIO, il proprietario del job Dataflow che legge i dati del flusso di modifiche richiede autorizzazioni IAM aggiuntive, sul database dell'applicazione o su un database di metadati separato. Consulta Creare un database di metadati.

Passaggi successivi