Gli errori di pubblicazione sono in genere causati da colli di bottiglia lato client, ad esempio CPU di servizio insufficienti, integrità dei thread non valida o congestione della rete. Il criterio relativo ai tentativi dell'editore definisce il numero di volte in cui Pub/Sub tenta di recapitare un messaggio e il periodo di tempo tra un tentativo e l'altro.
Questo documento fornisce informazioni sull'utilizzo delle richieste di nuovo tentativo 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 ritentare 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.
Potresti anche essere in grado di ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Devi disporre di autorizzazioni aggiuntive per creare o aggiornare argomenti e sottoscrizioni.
Informazioni sulle richieste di nuovo tentativo
Le impostazioni per i nuovi tentativi controllano il modo in cui le librerie client Pub/Sub ritentano la pubblicazione delle richieste. Le librerie client hanno una delle seguenti impostazioni per i nuovi tentativi:
- Timeout richiesta iniziale: la quantità di tempo prima che una libreria client si interrompa di attendere il completamento della richiesta di pubblicazione iniziale.
- Ritardo tra tentativi: il tempo di attesa dopo il timeout di una richiesta da parte della libreria client per riprovare a inviare la richiesta.
- Timeout totale: il periodo di tempo successivo all'interruzione dei nuovi tentativi di richiesta di pubblicazione da parte di una libreria client.
Per riprovare a pubblicare le richieste, 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 tra i nuovi tentativi come segue:
- Dopo ogni richiesta di pubblicazione, il timeout della richiesta aumenta del moltiplicatore della richiesta di timeout, fino al timeout massimo della richiesta.
- Dopo ogni nuovo tentativo, il ritardo aumenta del relativo moltiplicatore, fino al massimo ritardo tra tentativi.
Riprovare a inviare una richiesta di messaggio
Durante il processo di pubblicazione, potresti notare errori di pubblicazione temporanei o permanenti. Per gli errori temporanei, di solito non è necessario eseguire alcuna azione speciale, in quanto Pub/Sub riprova automaticamente a inviare i messaggi.
Un errore può anche verificarsi quando un'operazione di pubblicazione ha esito positivo, ma la risposta di pubblicazione non viene ricevuta in tempo dal client dell'editore. Anche in questo caso si ripete l'operazione di pubblicazione. Di conseguenza, puoi avere due messaggi identici con ID messaggio diversi.
In caso di errori persistenti, valuta l'implementazione di azioni appropriate al di fuori del processo di pubblicazione per evitare di sovraccaricare Pub/Sub.
Gli errori di pubblicazione vengono tentati automaticamente, ad eccezione degli errori che non richiedono nuovi tentativi. 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 personalizzate per i nuovi tentativi; consulta la documentazione di riferimento API per la lingua scelta):
C++
Prima di provare questo esempio, segui le istruzioni di configurazione di C++ riportate nella Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API C++ Pub/Sub.
C#
Prima di provare questo esempio, segui le istruzioni di configurazione di C# nella Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API C# di Pub/Sub.
Go
Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Go Pub/Sub.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione Java in Guida rapida sull'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 in Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Node.js Pub/Sub.
Node.js
Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js in Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Node.js Pub/Sub.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python in Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python Pub/Sub.
Riprova le richieste con le chiavi di ordinazione
Supponi di avere un solo cliente publisher. Stai utilizzando le librerie client di 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 del publisher prima della scadenza della scadenza RPC. Il messaggio 1 deve essere ripubblicato. La sequenza di messaggi ricevuti dal client del sottoscrittore diventa 1, 1, 2 e 3, se presupponi che il messaggio 2 venga pubblicato solo dopo che il messaggio 1 è stato completato correttamente. Ogni messaggio pubblicato ha il proprio ID messaggio. Dal punto di vista del client dell'abbonato, sono stati pubblicati quattro messaggi e i primi due avevano contenuti identici.
Riprovare le richieste di pubblicazione 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 supponiamo che i messaggi 1 e 2 vengano raggruppati. Questo batch viene inviato al server come una singola richiesta. Se il server non riesce a restituire una risposta in tempo, il client dell'editore prova nuovamente a 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, le operazioni di pubblicazione non andranno a buon fine per tutti i messaggi rimanenti sulla stessa chiave di ordinamento. Un cliente editore può quindi decidere di eseguire una delle seguenti operazioni:
Ripubblica tutti i messaggi con errori nell'ordine
Ripubblica un sottoinsieme dei messaggi con errori nell'ordine
Pubblicare una nuova serie 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 editore invia un messaggio a un argomento che non esiste, 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 riavvia la pubblicazione.
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++ riportate nella Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API C++ Pub/Sub.
C#
Prima di provare questo esempio, segui le istruzioni di configurazione di C# nella Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API C# di Pub/Sub.
Go
Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Go Pub/Sub.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione Java in Guida rapida sull'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 in Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Node.js Pub/Sub.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python in Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python Pub/Sub.
Ruby
Prima di provare questo esempio, segui le istruzioni di configurazione di Ruby riportate in Guida rapida sull'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, vedi quanto segue: