In questa pagina viene spiegato come ricevere e confermare i messaggi utilizzando la funzionalità "exactly-once" la semantica. Solo il tipo di sottoscrizione pull supporta la consegna "exactly-once", inclusi gli abbonati che usano API StreamingPull.
Esegui il push e l'esportazione delle sottoscrizioni non supportano la consegna "exactly-once".
Versioni consigliate della libreria client
- Per prestazioni ottimali, utilizza l'ultima versione della libreria client, Python Versione 2.13.6 o successiva, Java Versione 1.120.11 o successiva, Versione 1.39.0 o successiva, C# Versione 3.2.0 o successiva, C++ v2.1.0, Vai Versione 1.25.1 o successiva, Nodo Versione 3.2.0 o successiva e Rubino Versione 2.12.1 o successiva.
Consegna "exactly-once"
Pub/Sub supporta la consegna "exactly-once", all'interno di una regione cloud, sulla base di un'architettura Pub/Sub definita ID messaggio.
Quando la funzionalità è abilitata, Pub/Sub fornisce quanto segue:
Dopo la conferma del messaggio, non si verifica alcuna riconsegna.
Non si verifica alcuna riconsegna quando un messaggio è in sospeso. Un messaggio viene considerato in sospeso fino alla scadenza della conferma o fino al riconosciuto.
In caso di più consegne valide, a causa della scadenza di conferma data di scadenza o conferma negativa avviata dal client, solo l'ultima L'ID di conferma può essere utilizzato per confermare il messaggio. Qualsiasi richiesta con un ID di conferma precedente ha esito negativo.
Confronto tra ripubblicazione e duplicati
È importante comprendere la differenza tra previsto e imprevisto e nuovi caricamenti.
Una nuova pubblicazione può verificarsi a causa di un errore di tipo negativo avviato dal client conferma di un messaggio o quando il client non estende la conferma della scadenza del messaggio prima della scadenza dell'accettazione. Nuovi caricamenti sono considerati validi e che il sistema funziona come previsto.
Per risolvere i problemi relativi ai nuovi caricamenti, consulta la sezione Gestione dei duplicati.
Si verifica un duplicato quando un messaggio viene inviato nuovamente dopo una conferma di ricezione o prima della scadenza della conferma.
Un messaggio ricaricato conserva lo stesso ID messaggio tra un tentativo di riconsegna e l'altro.
Le sottoscrizioni con la consegna "exactly-once" abilitata non ricevono duplicati delle consegne.
Supporto della distribuzione "exactly-once" nelle librerie client
Le librerie client supportate hanno un'interfaccia per l'accettazione con risposta ad esempio Go. Puoi utilizzare questa interfaccia per verificare se la richiesta di conferma è andata a buon fine. Se la richiesta di conferma ha esito positivo, ai clienti viene garantito non riceveranno una nuova consegna. Se la richiesta di conferma non va a buon fine, i clienti possono aspettarsi una nuova pubblicazione.
I client possono anche utilizzare le librerie client supportate senza di conferma. Tuttavia, in questi casi, gli errori di conferma possono comportare il reinvio silenzioso dei messaggi.
Le librerie client supportate includono interfacce per l'impostazione del numero minimo durata dell'estensione del lease (esempio: Vai). Devi impostare un numero elevato per l'estensione di leasing minima per evitare scadenze di conferma relative alla rete. Il valore massimo è impostato su 600 secondi.
I valori e l'intervallo predefiniti per le variabili correlate alla pubblicazione "exactly-once" e i nomi delle variabili potrebbero essere diversi nelle librerie client. Per Ad esempio, nella libreria client Java, le seguenti variabili controllano la consegna "exactly-once".
Variabile | Descrizione | Valore |
---|---|---|
setEnableExactlyOnceDelivery |
Attiva o disattiva la consegna "exactly-once". | true o false Predefinito=false |
minDurationPerAckExtension |
Il tempo minimo in secondi da utilizzare per estendere la scadenza di conferma della modifica. | Intervallo=da 0 a 600 Predefinito=nessuno |
maxDurationPerAckExtension |
Il tempo massimo in secondi da utilizzare per estendere la scadenza di conferma della modifica. | Intervallo=da 0 a 600 Predefinito=nessuno |
In caso di consegna "exactly-once", modifyAckDeadline
o acknowledgment
a Pub/Sub ha esito negativo quando l'ID di conferma è già scaduto. In tale
casi, il servizio considera l'ID di conferma scaduto come non valido, in quanto
più recenti potrebbero essere già in corso. Questa funzionalità è progettata per "exactly-once"
la distribuzione dei contenuti. Vedrai poi le richieste acknowledgment
e ModifyAckDeadline
restituiscono un
Risposta INVALID_ARGUMENT
. Quando la consegna "exactly-once" è disattivata, questi dati
Le richieste restituiscono OK
in caso di ID di conferma scaduti.
Per garantire che le richieste acknowledgment
e ModifyAckDeadline
siano valide
ID conferma, ti consigliamo di impostare il valore per
minDurationPerAckExtension
a un numero alto.
Creare sottoscrizioni con consegna "exactly-once"
Puoi creare un abbonamento con consegna "exactly-once" utilizzando la console Google Cloud, Google Cloud CLI, la libreria client o l'API Pub/Sub.
Sottoscrizione pull
Console
Per creare una sottoscrizione pull con consegna "exactly-once", segui questi passaggi:
Nella console Google Cloud, vai alla pagina Abbonamenti.
Fai clic su Crea sottoscrizione.
Inserisci l'ID abbonamento.
Scegli o crea un argomento dal menu a discesa.
La sottoscrizione riceve messaggi dall'argomento.
Nella sezione Consegna "exactly-once", seleziona Abilita consegna "exactly-once".
Fai clic su Crea.
gcloud
Per creare una sottoscrizione pull con consegna "exactly-once", utilizza la classe
gcloud pubsub subscriptions create
con il flag --enable-exactly-once-delivery
:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --enable-exactly-once-delivery
Sostituisci quanto segue:
- SUBSCRIPTION_ID: l'ID dell'abbonamento da creare
- TOPIC_ID: l'ID dell'argomento da collegare alla sottoscrizione
REST
Per creare una sottoscrizione con consegna "exactly-once", utilizza il metodo
projects.subscriptions.create
.
PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID Authorization: Bearer $(gcloud auth print-access-token)
Sostituisci quanto segue:
- PROJECT_ID: l'ID del progetto per la creazione abbonamento in
- SUBSCRIPTION_ID: l'ID dell'abbonamento da creare
Per creare una sottoscrizione pull con consegna "exactly-once", specifica questo nel corpo della richiesta:
{ "topic": "projects/PROJECT_ID/topics/TOPIC_ID", "enableExactlyOnceDelivery": true, }
Sostituisci quanto segue:
- PROJECT_ID: l'ID del progetto con l'argomento
- TOPIC_ID: l'ID dell'argomento da collegare alla sottoscrizione
C++
Prima di provare questo esempio, segui le istruzioni per la configurazione di C++ in 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# in Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API C# Pub/Sub.
Vai
Prima di provare questo esempio, segui le istruzioni di configurazione di Go in 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 in Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java Pub/Sub.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python in Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python Pub/Sub.
Node.js
Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js in Guida rapida all'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 all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Node.js Pub/Sub.
Ruby
Prima di provare questo esempio, segui le istruzioni di configurazione di Ruby in Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Ruby Pub/Sub.
PHP
Prima di provare questo esempio, segui le istruzioni per la configurazione di PHP in Guida rapida all'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API PHP Pub/Sub.
Abbonati con la consegna dei messaggi "exactly-once"
Di seguito sono riportati alcuni esempi di codice per l'iscrizione con consegna "exactly-once" utilizzando la libreria client.
Sottoscrizione pull
Go
Prima di provare questo esempio, segui le istruzioni per la configurazione di Go nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub Go documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Java
Prima di provare questo esempio, segui le istruzioni per la configurazione di Java nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub Java documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Node.js
Prima di provare questo esempio, segui le istruzioni per la configurazione di Node.js nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub Node.js documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
PHP
Prima di provare questo esempio, segui le istruzioni per la configurazione di PHP nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub PHP documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Python
Prima di provare questo esempio, segui le istruzioni per la configurazione di Python nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub Python documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Ruby
Prima di provare questo esempio, segui le istruzioni per la configurazione di Ruby nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub Ruby documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
C++
Prima di provare questo esempio, segui le istruzioni per la configurazione di C++ nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub C++ documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
C#
Prima di provare questo esempio, segui le istruzioni per la configurazione di C# nel Guida rapida di Pub/Sub con librerie client. Per ulteriori informazioni, consulta API Pub/Sub C# documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Node.js (TypeScript)
Prima di provare questo esempio, segui le istruzioni per la configurazione di Node.js nella Guida rapida di Pub/Sub con l'utilizzo librerie client. Per ulteriori informazioni, consulta API Node.js Pub/Sub documentazione di riferimento.
Per eseguire l'autenticazione su Pub/Sub, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Monitorare le sottoscrizioni per la consegna "exactly-once"
La
subscription/exactly_once_warning_count
registra il numero di eventi che
possono comportare possibili pubblicazioni di nuovo (valide o duplicate). Questa metrica conteggia
volte in cui Pub/Sub non riesce a elaborare le richieste associate
ID conferma (richiesta ModifyAckDeadline
o acknowledgment
). Motivi
l'errore potrebbe essere basato su server o client. Ad esempio, se la persistenza
utilizzato per mantenere le informazioni di consegna "exactly-once" non disponibili,
un evento basato su server. Se il client prova a confermare la ricezione di un messaggio con
ID di conferma non valido, si tratta di un evento basato su client.
Comprendere la metrica
subscription/exactly_once_warning_count
acquisisce gli eventi che potrebbero o meno
che generano effettivamente ripubblicazioni e può generare rumore in base al comportamento del cliente. Per
esempio: richieste acknowledgment
o ModifyAckDeadline
ripetute con valore non valido
Gli ID di conferma incrementano la metrica ripetutamente.
Anche le seguenti metriche sono utili per comprendere il comportamento del cliente:
subscription/expired_ack_deadlines_count
mostra il numero di scadenze dell'ID di conferma. Riconoscimento Le scadenze degli ID possono determinare errori sia perModifyAckDeadline
che peracknowledgment
richieste.service.serviceruntime.googleapis.com/api/request_count
la metrica può essere utilizzata per acquisire gli errori diModifyAckDeadline
oacknowledgment
nei casi in cui le richieste arrivino a Google Cloud ma non e raggiungere Pub/Sub. Si sono verificati errori che non consentono di acquisizione, ad esempio quando i client sono disconnessi da Google Cloud.
Nella maggior parte dei casi di eventi di errore che è possibile ritentare, le librerie client supportate riprova a eseguire la richiesta automaticamente.
Quote
Gli abbonamenti per la consegna "exactly-once" sono soggetti a quota aggiuntiva i tuoi requisiti. Queste quote vengono applicate in modo forzato su:
- Numero di messaggi consumati dalle sottoscrizioni con consegna "exactly-once" abilitate per regione.
- Numero di messaggi confermati o la cui scadenza è stata estesa quando si utilizza con la consegna "exactly-once" abilitata per regione.
Per ulteriori informazioni su queste quote, consulta la tabella Quote.
Consegna "exactly-once" e abbonamenti ordinati
Pub/Sub supporta la consegna "exactly-once" con consegna ordinata.
Quando utilizzi l'ordinamento con consegna "exactly-once", Pub/Sub prevede i riconoscimenti devono essere in ordine. Se le conferme non sono nell'ordine corretto, i non riesce le richieste con errori temporanei. Se la scadenza di conferma scadono prima di una conferma di consegna in ordine, il cliente ricevere una nuova consegna del messaggio. Per questo motivo, quando utilizzi l'ordine con la distribuzione "exactly-once", la velocità effettiva del client è limitata a un ordine di migliaia di di messaggi al secondo.
Consegna "exactly-once" e iscrizioni push
Pub/Sub supporta la consegna "exactly-once" solo con le sottoscrizioni pull.
I client che utilizzano i messaggi delle sottoscrizioni push riconoscono i messaggi rispondendo alle richieste push con esito positivo. Tuttavia, i clienti non so se la sottoscrizione Pub/Sub ha ricevuto la risposta e l'ha elaborato. È diverso dalle sottoscrizioni pull, in cui l'accettazione vengono avviate dai client e dalla sottoscrizione Pub/Sub risponde se la richiesta è stata elaborata correttamente. Per questo motivo, la semantica della consegna "exactly-once" non si allinea bene alle sottoscrizioni push.
Aspetti da tenere presenti
Se la scadenza dell'accettazione non è specificata al momento della creazione di una sottoscrizione, Gli abbonamenti abilitati per l'invio "exactly-once" avranno un riconoscimento predefinito una scadenza di 60 secondi.
Scadenze di conferma predefinite più lunghe sono vantaggiose per evitare a causa di eventi di rete. Le librerie client supportate non utilizzano scadenza predefinita di conferma dell'abbonamento.
Gli abbonamenti a "exactly-once" hanno registrato un aumento la latenza da pubblicazione a sottoscrizione rispetto alle normali sottoscrizioni.
Se hai bisogno di una velocità effettiva elevata, i client di consegna "exactly-once" devono utilizzare anche il flusso di dati pull.
Una sottoscrizione potrebbe ricevere più copie dello stesso messaggio a causa dei duplicati sul lato della pubblicazione, anche con la consegna "exactly-once" attivata. I duplicati lato pubblicazione possono essere dovuti a più tentativi di pubblicazione univoci da parte del di pubblicazione o il servizio Pub/Sub. La presenza di più pubblicazioni univoche da parte del client di pubblicazione, a seguito di diversi nuovi tentativi, comporta ulteriori caricamenti con ID messaggio diversi. Più pubblicazioni univoche da parte del servizio Pub/Sub, per rispondere a una richiesta di pubblicazione del client, comportano il ricaricamento con gli stessi ID messaggio.
Puoi riprovare a eseguire gli errori in
subscription/exactly_once_warning_count
e nelle librerie client supportate questi nuovi tentativi automaticamente. Tuttavia, gli errori relativi a ID di conferma non validi non possono da riprovare.