Creare un sistema Pub/Sub uno-a-molti

Questo tutorial illustra la configurazione di un insieme di applicazioni che comunicano inviando messaggi tramite Pub/Sub anziché RPC sincrone. Separando le applicazioni, la messaggistica:

  • Rende le applicazioni più robuste
  • Potrebbe semplificare lo sviluppo

Ad esempio, il chiamante (editore) non ha bisogno che il destinatario (abbonato) sia attivo e disponibile. Il publisher invia un messaggio a Pub/Sub. Il publisher non ha bisogno di sapere quali e quante applicazioni dei sottoscrittori devono ricevere il messaggio. Di conseguenza, il servizio può essere considerato affidabile per recapitare il messaggio a una o più applicazioni abbonate ogni volta che sono disponibili.

Panoramica del sistema

In questo tutorial, avvii un'applicazione publisher che invia un messaggio "Hello, World!" a due abbonati utilizzando la comunicazione uno-a-molti, come illustrato nel seguente diagramma:

Diagramma dell'argomento, delle relative sottoscrizioni associate e delle applicazioni publisher e sottoscrittore che inviano e ricevono messaggi da Cloud Pub/Sub

Le due applicazioni di abbonato utilizzano lo stesso codice, ma le avvii in momenti diversi. Questo processo mostra come Pub/Sub consente la comunicazione asincrona. Per creare questo sistema, completa i seguenti passaggi:

  1. Crea un account di servizio IAM che le applicazioni utilizzano per l'autenticazione.
  2. Configura le autorizzazioni IAM.
  3. Crea un argomento e una sottoscrizione Pub/Sub.
  4. Avvia tre applicazioni indipendenti: un publisher e due abbonati.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. Installa Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  6. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  7. Abilita l'API Pub/Sub:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    gcloud services enable pubsub.googleapis.com
  8. Crea le credenziali di autenticazione locali per il tuo account utente:

    gcloud auth application-default login

    Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver acceduto a gcloud CLI con la tua identità federata.

  9. Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • USER_IDENTIFIER: l'identificatore del tuo account utente . Ad esempio: myemail@example.com.
    • ROLE: il ruolo IAM che concedi al tuo account utente.
  10. Installa Google Cloud CLI.

  11. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  12. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  13. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  14. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  15. Abilita l'API Pub/Sub:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    gcloud services enable pubsub.googleapis.com
  16. Crea le credenziali di autenticazione locali per il tuo account utente:

    gcloud auth application-default login

    Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver acceduto a gcloud CLI con la tua identità federata.

  17. Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • USER_IDENTIFIER: l'identificatore del tuo account utente . Ad esempio: myemail@example.com.
    • ROLE: il ruolo IAM che concedi al tuo account utente.

Installa Python

Questo tutorial utilizza le librerie client Pub/Sub, che richiedono Python 3.7 o versioni successive. Completa le istruzioni per installare Python.

Configurare il progetto Pub/Sub

Per gestire il flusso di messaggi tra le applicazioni di pubblicazione e sottoscrizione, devi creare un argomento e due sottoscrizioni diverse.

Crea un argomento Pub/Sub

Crea un argomento con ID hello_topic:

gcloud pubsub topics create hello_topic

Crea sottoscrizioni Pub/Sub

Crea due sottoscrizioni e collegale all'argomento.

Questi abbonamenti sono di tipo StreamingPull, ovvero un tipo di abbonamento pull.

Sottoscrizione 1

Crea una sottoscrizione con l'ID sub_one e collegala a hello_topic.

gcloud pubsub subscriptions create sub_one --topic=hello_topic

Sottoscrizione 2

Crea una sottoscrizione con l'ID sub_two e collegala a hello_topic.

gcloud pubsub subscriptions create sub_two --topic=hello_topic

Crea il sistema one-to-many

Scarica il codice del publisher e dell'abbonato

  1. Scarica i file Python di Pub/Sub necessari per questo tutorial.

     git clone https://github.com/googleapis/python-pubsub.git
  2. Chiudi tutti i terminali aperti prima di procedere.

Configura tre terminali

  1. Avvia un terminale per ogni applicazione tutorial (un editore e due abbonati). Per praticità, questo tutorial chiama questi terminali:

    • Terminale publisher
    • sub_one terminale
    • sub_two terminale
  2. Nel terminale publisher, crea e attiva un ambiente virtuale Python denominato pyenv-qs.

    Bash

    python -m venv pyenv-qs
    source pyenv-qs/bin/activate

    PowerShell

    py -m venv pyenv-qs
    .\pyenv-qs\Scripts\activate

    Nei terminali sub_one e sub_two, esegui questo comando:

    Bash

    source pyenv-qs/bin/activate

    PowerShell

    .\pyenv-qs\Scripts\activate

    Dopo aver eseguito il comando di attivazione, il prompt dei comandi include il seguente valore (pyenv-qs) $.

  3. Nel terminale publisher, installa la libreria client Python Pub/Sub utilizzando pip:

    python -m pip install --upgrade google-cloud-pubsub
  4. In tutti e tre i terminali, configura una variabile di ambiente con il tuo ID progetto attuale. Questo comando gcloud determina l'ID progetto selezionato e lo imposta come variabile:

    Bash

    export PROJECT=`gcloud config get-value project`

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
  5. In tutti e tre i terminali, passa al percorso del progetto che contiene il codice campione.

    cd python-pubsub/samples/snippets/quickstart/

Avvia le app e osserva il flusso dei messaggi

Avvia l'applicazione Abbonato 1

Nel terminale sub_one, avvia Subscriber 1:

Bash

python sub.py $PROJECT sub_one

PowerShell

py sub.py $env:PROJECT sub_one

Una volta avviata, questa applicazione apre una connessione di streaming bidirezionale con il server. Pub/Sub recapita i messaggi tramite lo stream.

L'applicazione
  dell'abbonato 1 inizia ad ascoltare i messaggi nella sottoscrizione sub_one.

Avviare l'applicazione Publisher

Nel terminale publisher, avvia l'applicazione Publisher:

Bash

python pub.py $PROJECT hello_topic

PowerShell

py pub.py $env:PROJECT hello_topic

Dopo l'avvio dell'applicazione publisher, il sistema Pub/Sub esegue le seguenti operazioni:

  • L'applicazione Publisher invia un messaggio "Hello, World!" a Pub/Sub senza essere a conoscenza di eventuali abbonamenti esistenti. Il server assegna anche un ID messaggio.

  • L'applicazione Subscriber 1 riceve il messaggio "Hello World", lo stampa e invia un riconoscimento a Pub/Sub.

  • L'applicazione Publisher stampa la conferma. La conferma indica a Pub/Sub che il messaggio è stato elaborato correttamente e non deve essere inviato di nuovo a questo o a qualsiasi altro sottoscrittore sub_one.

Pub/Sub rimuove il messaggio da sub_one.

L'applicazione Publisher
  pubblica il messaggio e assegna un ID messaggio. L'applicazione Subscriber 1
  riceve il messaggio "Hello World" e invia un
  riconoscimento

Avvia l'applicazione Abbonato 2

Nel terminale sub_two, avvia Subscriber 2:

Bash

python sub.py $PROJECT sub_two

PowerShell

py sub.py $env:PROJECT sub_two

Questo abbonato riceve i messaggi recapitati all'abbonamento sub_two. Abbonato 2 riutilizza lo script sub.py. La differenza è che Subscriber 2 non viene avviato finché il publisher non ha inviato il messaggio all'argomento e agli abbonamenti. Se Publisher chiamasse direttamente Subscriber 2, l'applicazione di pubblicazione dovrebbe attendere che Subscriber 2 risponda o che la chiamata scada. Pub/Sub gestisce questo processo salvando il messaggio per Subscriber 2.

L'abbonato 2
  inizia ad ascoltare e riceve il messaggio in attesa in
  sub_two

Ora puoi iniziare a sviluppare con Pub/Sub.

Com'è andata?

Ulteriori risorse e link sono disponibili nella pagina di assistenza Pub/Sub.

Esegui la pulizia

  1. Interrompi tutte le applicazioni in esecuzione.
  2. Elimina la directory del codice campione dall'ambiente locale.
  3. Elimina l'argomento.

    gcloud pubsub topics delete hello_topic
  4. Elimina gli abbonamenti.

    gcloud pubsub subscriptions delete sub_one
    gcloud pubsub subscriptions delete sub_two
  5. Chiudi il progetto tutorial nella sezione IAM e amministrazione della console Google Cloud .

  6. (Facoltativo) Revoca le credenziali di autenticazione che hai creato ed elimina il file delle credenziali locale.

    gcloud auth application-default revoke
  7. (Facoltativo) Revoca le credenziali da gcloud CLI.

    gcloud auth revoke

Passaggi successivi

Ecco alcune cose che puoi provare a fare:

  • Esamina il codice pub.py e sub.py del tutorial ed esplora altri esempi di Pub/Sub su GitHub. Come esercizio, crea una versione di pub.py che pubblica l'ora locale ogni secondo.

  • Scopri come raggruppare i messaggi.

  • Utilizzando le sottoscrizioni push, ricevi messaggi che attivano gli endpoint App Engine o Cloud Functions.

  • Recupera i messaggi confermati in precedenza utilizzando la riproduzione. Per impostazione predefinita, Pub/Sub rimuove i messaggi confermati dalle sottoscrizioni. In questo tutorial, ad esempio, non potrai eseguire di nuovo sub.py per ricevere di nuovo il messaggio "Hello, World!". La funzionalità di riproduzione ti consente di configurare le sottoscrizioni in modo da ricevere i messaggi dopo che sono stati confermati.

  • Inizia a utilizzare le librerie client in altre lingue.