Questo documento fornisce alcuni suggerimenti comuni per la risoluzione dei problemi durante la pubblicazione di messaggi in un argomento Pub/Sub standard.
Scopri di più su come pubblicare messaggi negli argomenti e sulle diverse funzionalità.
Latenza di pubblicazione elevata
La latenza di pubblicazione è il tempo necessario per completare una richiesta di pubblicazione
emessa da un client publisher. La latenza di pubblicazione è diversa dalla latenza di consegna end-to-end, ovvero il tempo necessario affinché un messaggio pubblicato su Pub/Sub venga consegnato a un client sottoscrittore. Potresti notare
una latenza di pubblicazione o end-to-end elevata, anche quando il valore dell'altro
tipo di latenza è basso. Una latenza di pubblicazione elevata può verificarsi nel client publisher Pub/Sub, durante il transito tra il client e il backend Pub/Sub o nel backend Pub/Sub. Puoi
ispezionare la latenza di pubblicazione sostenuta nel backend Pub/Sub utilizzando
la metrica topic/send_request_latencies. L'elevata latenza di pubblicazione del backend potrebbe essere correlata ai seguenti fattori:
Pub/Sub è progettato per una distribuzione a bassa latenza e ad alto throughput. Se l'argomento ha una velocità effettiva bassa, l'inizializzazione delle risorse associate all'argomento potrebbe richiedere più tempo.
Se utilizzi una norma di archiviazione dei messaggi, questa potrebbe influire sulla latenza complessiva delle richieste all'argomento e all'abbonamento. Controlla le implicazioni in termini di prestazioni e disponibilità dell'utilizzo di questa configurazione.
Se il tuo client publisher osserva una latenza di pubblicazione significativamente superiore a quella riflessa nella metrica, potrebbe essere un segnale di uno di questi fattori lato client:
Assicurati di non creare un nuovo editore per ogni pubblicazione. È consigliabile utilizzare un singolo client publisher per argomento per applicazione per pubblicare tutti i messaggi. L'avvio di nuovi oggetti publisher e l'aggiunta di nuovi thread comporta un costo di latenza. Se utilizzi le funzioni Cloud Run per pubblicare messaggi, tieni presente che anche le chiamate possono influire sulla latenza di pubblicazione.
Se ritieni che le impostazioni di ripetizione predefinite non siano sufficienti per il tuo caso d'uso, apporta le modifiche corrispondenti. Tuttavia, verifica che i nuovi valori non siano troppo elevati. Scopri come configurare i tentativi di richiesta.
Tieni presente che una latenza di pubblicazione elevata può causare errori DEADLINE_EXCEEDED, che
vengono trattati nella sezione successiva.
Le operazioni di pubblicazione non riescono con DEADLINE_EXCEEDED
Un errore DEADLINE_EXCEEDED durante una richiesta di pubblicazione indica che la richiesta
non è stata completata entro il tempo assegnato. Ciò potrebbe essere dovuto a vari
fattori, ad esempio le richieste che non raggiungono il servizio Pub/Sub o
problemi di prestazioni che influiscono sulle richieste.
Per verificare che le richieste di pubblicazione raggiungano il servizio Pub/Sub,
monitora l'argomento utilizzando la metrica
topic/send_request_count, raggruppata per response_code. Questa metrica ti aiuta a determinare se le richieste
non vanno a buon fine prima di raggiungere l'argomento Pub/Sub. Se la metrica è vuota, esiste un fattore esterno che impedisce ai messaggi di raggiungere il servizio Pub/Sub. Inoltre, per escludere la possibilità di un problema intermittente,
controlla il tasso di errori utilizzando il grafico della metrica topic/send_request_count menzionato
in precedenza o la pagina API e
servizi nella
consoleGoogle Cloud . Se il tasso di errore è molto basso, potrebbe trattarsi di un problema intermittente.
Se le richieste raggiungono Pub/Sub, ecco alcune possibili cause del
mancato funzionamento delle operazioni di pubblicazione con un errore DEADLINE_EXCEEDED:
Collo di bottiglia lato client
Gli errori di pubblicazione sono probabilmente causati da un collo di bottiglia lato client, ad esempio
memoria insufficiente, pressione della CPU, thread non integro o congestione della rete nella
VM che ospita il client publisher. Se una chiamata Publish restituisce
DEADLINE_EXCEEDED, è possibile che le chiamate asincrone Publish vengano
inserite in coda più velocemente di quanto vengano inviate al servizio, il che aumenta progressivamente
la latenza delle richieste. Inoltre, controlla se uno dei seguenti suggerimenti può aiutarti a
determinare un possibile collo di bottiglia nel tuo sistema:
Controlla se pubblichi messaggi più velocemente di quanto il client possa inviarli. In genere, ogni chiamata asincrona
Publishrestituisce un oggettoFuture. Per monitorare il numero di messaggi in attesa di essere inviati, memorizza il numero di messaggi da inviare con ogni chiamataPublished eliminalo solo nel callback dell'oggettoFuture.Assicurati di avere una larghezza di banda di caricamento sufficiente tra la macchina in cui viene eseguito il publisher e Google Cloud. Le reti Wi-Fi di sviluppo in genere hanno una larghezza di banda di 1-10 MBps o 1000-10.000 messaggi tipici al secondo. La pubblicazione di messaggi in loop senza alcuna limitazione di frequenza potrebbe creare un breve picco di larghezza di banda elevata in un breve periodo di tempo. Per evitare questo problema, puoi eseguire il publisher su una macchina all'interno di Google Cloud o ridurre la velocità con cui pubblichi i messaggi in modo che corrisponda alla larghezza di banda disponibile.
Controlla se noti una latenza molto elevata tra l'host e Google Cloud per motivi quali congestione della rete di avvio o firewall. Calcolo del throughput di rete fornisce indicazioni su come scoprire la larghezza di banda e la latenza per diversi scenari.
In definitiva, esiste un limite alla quantità di dati che una singola macchina può pubblicare. Potresti dover provare a scalare orizzontalmente o eseguire più istanze del client publisher su più macchine. Testare i client Cloud Pub/Sub per massimizzare le prestazioni di streaming mostra come Pub/Sub viene scalato su una singola VM Google Cloud con un numero crescente di CPU. Ad esempio, puoi raggiungere da 500 MBps a 700 MBps per i messaggi da 1 KB su un'istanza Compute Engine a 16 core.
Durata del timeout di pubblicazione non adeguata
Per ridurre la frequenza di timeout per le chiamate di pubblicazione, assicurati di aver definito un timeout sufficientemente lungo nelle impostazioni di nuovi tentativi del client publisher. Per le impostazioni dei tentativi, imposta la scadenza iniziale su 10 secondi e il timeout totale su 600 secondi. Anche se non stai accumulando un backlog di messaggi non inviati, picchi occasionali nella latenza delle richieste possono causare il timeout delle chiamate di pubblicazione. Tuttavia, se i problemi sono causati da un collo di bottiglia persistente, anziché da timeout occasionali, riprovare più volte potrebbe causare più errori.
Problemi relativi alla libreria client
Potresti utilizzare una versione della libreria client con un problema noto. L'elenco seguente include i tracker dei problemi per tutte le librerie client. Se riscontri un problema noto che interessa la versione della libreria client che stai utilizzando, esegui l'upgrade all'ultima versione della libreria client. In questo modo, ti assicuri di aver scaricato tutti gli aggiornamenti pertinenti, incluse correzioni e miglioramenti delle prestazioni.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Problemi dello schema
Se le pubblicazioni iniziano a restituire INVALID_ARGUMENT, è possibile che
qualcuno abbia aggiornato l'argomento per modificare lo
schema associato, eliminato
lo schema o eliminato le revisioni dello schema
associate all'argomento. In questo caso, aggiorna le impostazioni dello schema dell'argomento a uno schema e a un insieme di revisioni che corrispondono ai messaggi pubblicati oppure modifica il formato del messaggio in modo che corrisponda allo schema attuale.
Problemi relativi alla crittografia dei messaggi
Se hai configurato l'argomento Pub/Sub per criptare i messaggi pubblicati
utilizzando una chiave di crittografia gestita dal cliente, la pubblicazione potrebbe non riuscire con un
errore FAILED_PRECONDITION. Questo errore può verificarsi se la chiave Cloud KMS è disattivata o se le chiavi gestite esternamente tramite Cloud EKM non sono più accessibili. Per riprendere la pubblicazione, ripristina l'accesso alla
chiave.
Problemi relativi alle trasformazioni di messaggi singoli (SMT)
Se hai configurato SMT nell'argomento Pub/Sub, la pubblicazione potrebbe non riuscire e generare errori INVALID_ARGUMENT quando le trasformazioni non vengono applicate ai messaggi. Se la trasformazione di un messaggio in un batch di pubblicazione non va a buon fine, l'intero batch non viene pubblicato. L'errore
restituito indica il motivo dell'errore, ad esempio:
INVALID_ARGUMENT: Pub/Sub failed to apply a message transformation to one or
more messages in the publish request. Error: Failed to execute JavaScript UDF:
`my_function`. Return value is not an object.
Monitorare le SMT
Per comprendere il rendimento e l'impatto degli SMT su un argomento, utilizza le seguenti metriche di monitoraggio:
La metrica topic/message_transform_latencies misura il tempo necessario per applicare le trasformazioni SMT a un messaggio. La metrica misura solo la latenza SMT e non include altre parti del tempo di consegna del messaggio.
La metrica fornisce due etichette chiave:
status: indica se la trasformazione è riuscita o se si è verificato un problema.filtered: indica se l'SMT ha causato il filtraggio del messaggio. Quando un SMT filtra un messaggio in un argomento, Pub/Sub lo elimina e non lo invia mai ai sottoscrittori. Questa etichettafilteredè vera solo quando un SMT esegue il filtraggio. I messaggi filtrati utilizzando le funzionalità di filtraggio integrate di Pub/Sub non vengono riflessi in questa metrica specifica.
La metrica topic/byte_cost viene utilizzata per identificare i messaggi filtrati dalle SMT o in cui le SMT non sono riuscite. Cerca questi valori specifici:
Quando un SMT filtra un messaggio, operation_type è
smt_publish_filter_drop.Se un SMT non riesce a trasformare un messaggio, viene visualizzato un
response_codeche non èOK.
Passaggi successivi
Esplora il tracing OpenTelemetry per aiutarti a eseguire il debug della latenza di pubblicazione.