I problemi di pubblicazione sono in genere causati da colli di bottiglia lato client, ad esempio CPU di servizio insufficienti, stato del thread scadente o congestione della rete. Il criterio di ripetizione del publisher definisce il numero di volte che Pub/Sub tenta di consegnare un messaggio e il periodo di tempo tra ogni tentativo.
Questo documento fornisce informazioni sull'utilizzo delle richieste di ripetizione 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 Publisher Pub/Sub (roles/pubsub.publisher
) per l'argomento.
Per saperne di più sulla concessione dei ruoli, consulta Gestire 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 iscrizioni, sono necessarie autorizzazioni aggiuntive.
Informazioni sulle richieste di ripetizione
Le impostazioni di ripetizione consentono di controllare la modalità di ripetizione delle richieste di pubblicazione da parte delle librerie client Pub/Sub. Le librerie client hanno una delle seguenti impostazioni di ripetizione:
- Timeout della richiesta iniziale: il tempo che intercorre prima che una libreria client smetta di attendere il completamento della richiesta di pubblicazione iniziale.
- Ritardo di ripetizione: il tempo che una libreria client attende dopo il timeout di una richiesta prima di riprovare.
- Timeout totale: il periodo di tempo che intercorre dopo che una libreria client smette di riprovare a pubblicare le richieste.
Per riprovare a inviare le richieste di pubblicazione, il timeout della richiesta iniziale deve essere inferiore al timeout totale. Ad esempio, se utilizzi il backoff esponenziale, le librerie client calcolano il timeout della richiesta e il ritardo del nuovo tentativo come segue:
- 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 aumenta in base al moltiplicatore del ritardo, fino al ritardo massimo.
Riprovare a inviare una richiesta di messaggio
Durante la procedura di pubblicazione, potresti riscontrare errori di pubblicazione temporanei o permanenti. In genere, per gli errori temporanei non è necessaria alcuna azione speciale, poiché Pub/Sub riprova automaticamente a inviare i messaggi.
Un errore può verificarsi anche quando un'operazione di pubblicazione va a buon fine, ma la risposta alla pubblicazione non viene ricevuta in tempo dal client del publisher. Anche in questo caso, viene riprovato a eseguire l'operazione di pubblicazione. 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 del processo 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 di ripetizione. Questo codice campione mostra la creazione di un publisher con impostazioni di ripetizione personalizzate (tieni presente che non tutte le librerie client supportano le impostazioni di ripetizione personalizzate; consulta la documentazione di riferimento dell'API per la lingua scelta):
C++
Prima di provare questo esempio, segui le istruzioni di configurazione C++ riportate 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 C# riportate 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 riportate nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub Go.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione di Java riportate nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java Pub/Sub.
Node.js
Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js riportate nella Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, 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 riportate nella Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub Node.js.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python riportate nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub per Python.
Riprova le richieste con chiavi di ordinamento
Supponiamo che tu abbia un solo client publisher. Utilizzi 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 della scadenza dell'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 presume 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 cliente sottoscrittore, sono stati pubblicati quattro messaggi, i primi due con contenuti identici.
Anche il tentativo di pubblicare nuovamente le richieste con le chiavi di ordinamento può essere complicato dalle impostazioni di gruppo. La libreria client raggruppa i messaggi per una pubblicazione più efficiente. Continua con l'esempio precedente e ipotizza che i messaggi 1 e 2 siano raggruppati insieme. Questo batch viene inviato al server come singola richiesta. Se il server non riesce a restituire una risposta in tempo, il client del publisher riprova 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:
Ripubblicare 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 ripetibile, 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 ripetibile. Per continuare a pubblicare messaggi con la stessa chiave di ordinamento, chiama un metodo per riprendere la pubblicazione e poi ricomincia a pubblicare.
L'esempio seguente mostra come riprendere la pubblicazione dei messaggi con la stessa chiave di ordinamento.
C++
Prima di provare questo esempio, segui le istruzioni di configurazione C++ riportate 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 C# riportate 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 riportate nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub Go.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione di Java riportate nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java Pub/Sub.
Node.js
Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js riportate nella Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub Node.js.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python riportate nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Pub/Sub per Python.
Ruby
Prima di provare questo esempio, segui le istruzioni di configurazione di Ruby riportate nella guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Ruby Pub/Sub.
Passaggi successivi
Per scoprire come configurare le opzioni di pubblicazione avanzate, consulta quanto segue: