Gli errori di pubblicazione sono in genere causati da colli di bottiglia lato client, ad esempio CPU di servizio insufficienti, stato dei thread non integro o congestione della rete. Il criterio di ripetizione del publisher definisce il numero di volte in cui Pub/Sub tenta di recapitare un messaggio e l'intervallo di tempo tra un tentativo e l'altro.
Questo documento fornisce informazioni sull'utilizzo dei tentativi di richiesta con i messaggi pubblicati in un argomento.
Prima di iniziare
Prima di configurare il flusso di lavoro di pubblicazione, assicurati di aver completato le seguenti attività:
- Scopri di più sugli argomenti e sul flusso di lavoro di pubblicazione.
- Crea un argomento.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per riprovare le richieste di messaggi a un argomento, chiedi all'amministratore di concederti il ruolo IAM Pub/Sub Publisher (roles/pubsub.publisher
) nell'argomento.
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Per creare o aggiornare argomenti e abbonamenti, devi disporre di autorizzazioni aggiuntive.
Informazioni sui tentativi di richiesta
Le impostazioni di ripetizione controllano il modo in cui le librerie client Pub/Sub ripetono le richieste di pubblicazione. Le librerie client hanno una delle seguenti impostazioni di nuovi tentativi:
- Timeout della richiesta iniziale: il periodo di tempo prima che una libreria client smetta di attendere il completamento della richiesta di pubblicazione iniziale.
- Ritardo di ripetizione: il periodo di tempo dopo il timeout di una richiesta che una libreria client attende per riprovare a inviare la richiesta.
- Timeout totale: il periodo di tempo dopo il quale una libreria client smette di riprovare a pubblicare le richieste.
Per riprovare le richieste di pubblicazione, il timeout iniziale della richiesta deve essere inferiore al timeout totale. Ad esempio, se utilizzi il backoff esponenziale, le librerie client calcolano il timeout della richiesta e il ritardo dei nuovi tentativi nel seguente modo:
- Dopo ogni richiesta di pubblicazione, il timeout della richiesta aumenta del moltiplicatore del timeout della richiesta, fino al timeout massimo della richiesta.
- Dopo ogni nuovo tentativo, il ritardo tra i tentativi aumenta in base al moltiplicatore del ritardo tra i tentativi, fino al ritardo massimo tra i tentativi.
Riprovare a inviare una richiesta di messaggi
Durante la procedura di pubblicazione, potresti riscontrare errori di pubblicazione temporanei o permanenti. Per gli errori temporanei, in genere non è necessario intraprendere alcuna azione speciale, poiché Pub/Sub ritenta automaticamente l'invio dei messaggi.
Un errore può verificarsi anche quando un'operazione di pubblicazione va a buon fine, ma la risposta non viene ricevuta in tempo dal client publisher. Anche in questo caso, l'operazione di pubblicazione viene ritentata. Di conseguenza, puoi avere due messaggi identici con ID messaggio diversi.
In caso di errori persistenti, valuta la possibilità di implementare azioni appropriate al di fuori della procedura di pubblicazione per evitare di sovraccaricare Pub/Sub.
I tentativi di pubblicazione non riusciti vengono ripetuti automaticamente, ad eccezione degli errori che non giustificano i tentativi. Questo codice campione mostra la creazione di un publisher con impostazioni di nuovi tentativi personalizzate (tieni presente che non tutte le librerie client supportano le impostazioni di nuovi tentativi personalizzate; consulta la documentazione di riferimento dell'API per la lingua che hai scelto):
C++
Prima di provare questo esempio, segui le istruzioni di configurazione di C++ nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub C++.
C#
Prima di provare questo esempio, segui le istruzioni di configurazione di C# nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub C#.
Vai
Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Go.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java di Pub/Sub.
Node.js
Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js nella Guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Node.js.
Node.js
Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js nella Guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Node.js.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Python.
Riprova le richieste con chiavi di ordinamento
Supponiamo di avere un solo client publisher. Stai utilizzando le librerie client Pub/Sub per pubblicare i messaggi 1, 2 e 3 per la stessa chiave di ordinamento A. Ora supponiamo che la risposta pubblicata per il messaggio 1 non venga ricevuta dal client publisher prima della scadenza del termine RPC. Il messaggio 1 deve essere ripubblicato. La sequenza di messaggi ricevuti dal client dell'abbonato diventa quindi 1, 1, 2 e 3, se si presuppone che il messaggio 2 venga pubblicato solo dopo il completamento del messaggio 1. Ogni messaggio pubblicato ha il proprio ID messaggio. Dal punto di vista del client abbonato, sono stati pubblicati quattro messaggi, i primi due con contenuti identici.
Il nuovo tentativo di pubblicazione delle richieste con chiavi di ordinamento può essere complicato anche dalle impostazioni batch. La libreria client raggruppa i messaggi per una pubblicazione più efficiente. Continua con l'esempio precedente e supponi che i messaggi 1 e 2 siano raggruppati in batch. Questo batch viene inviato al server come singola richiesta. Se il server non riesce a restituire una risposta in tempo, il client publisher ritenta questo batch di due messaggi. Pertanto, è possibile che il client sottoscrittore riceva i messaggi 1, 2, 1, 2 e 3. Se utilizzi una libreria client Pub/Sub per pubblicare i messaggi in ordine e un'operazione di pubblicazione non va a buon fine, il servizio non riesce a pubblicare tutti i messaggi rimanenti con la stessa chiave di ordinamento. Un client publisher può quindi decidere di eseguire una delle seguenti operazioni:
Ripubblica tutti i messaggi non riusciti in ordine
Ripubblicare un sottoinsieme dei messaggi non riusciti in ordine
Pubblicare un nuovo insieme di messaggi
Se si verifica un errore non riproducibile, la libreria client non pubblica il messaggio e interrompe la pubblicazione di altri messaggi con la stessa chiave di ordinamento. Ad esempio, quando un publisher invia un messaggio a un argomento inesistente, si verifica un errore non riproducibile. Per continuare a pubblicare messaggi con la stessa chiave di ordinamento, chiama un metodo per riprendere la pubblicazione e poi ricomincia a pubblicare.
Il seguente esempio mostra come riprendere la pubblicazione dei messaggi con la stessa chiave di ordinamento.
C++
Prima di provare questo esempio, segui le istruzioni di configurazione di C++ nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub C++.
C#
Prima di provare questo esempio, segui le istruzioni di configurazione di C# nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub C#.
Vai
Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Go.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java di Pub/Sub.
Node.js
Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js nella Guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Node.js.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Python.
Ruby
Prima di provare questo esempio, segui le istruzioni di configurazione di Ruby nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Ruby.
Passaggi successivi
Per scoprire come configurare le opzioni di pubblicazione avanzate, consulta quanto segue: