Scrittura di messaggi Cloud Pub/Sub e risposta a tali messaggi

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base all'area geografica selezionata al momento della creazione dell'app. Il codice non corrisponde a un paese o a una provincia, anche se alcuni ID di area geografica potrebbero essere simili ai codici di paese e provincia di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL di App Engine. Per le app esistenti create prima di questa data, l'ID area geografica è facoltativo nell'URL.

Scopri di più sugli ID dell'area geografica.

Pub/Sub fornisce messaggistica asincrona many-to-many affidabile tra le applicazioni. Le applicazioni dei publisher possono inviare messaggi a un argomento, mentre le altre applicazioni possono iscriversi all'argomento per ricevere i messaggi.

Questo documento descrive come utilizzare la libreria client di Cloud per inviare e ricevere messaggi Pub/Sub in un'app Python.

Prerequisiti

  • Segui le istruzioni in Hello, World! per Python su App Engine per configurare l'ambiente e il progetto e per comprendere come sono strutturate le app Python di App Engine.
  • Annota e salva l'ID progetto, perché ti servirà per eseguire l'applicazione di esempio descritta in questo documento.

    Clonazione dell'app di esempio

    Copia le app di esempio nella tua macchina locale e accedi alla directory pubsub:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/appengine/flexible/pubsub
    

    Creazione di un argomento e di una sottoscrizione

    Crea un argomento e una sottoscrizione, che includono la specifica dell'endpoint a cui il server Pub/Sub deve inviare richieste:

    gcloud pubsub topics create YOUR_TOPIC_NAME
    gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
        --topic YOUR_TOPIC_NAME \
        --push-endpoint \
        https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/pubsub/push?token=YOUR_TOKEN \
        --ack-deadline 10
    

    Sostituisci YOUR_TOKEN con un token casuale segreto. L'endpoint push utilizza questo valore per verificare le richieste.

    Imposta le variabili di ambiente

    Modifica il file app.yaml per impostare le variabili di ambiente per l'ID, l'argomento e il token di verifica del progetto:

    env_variables:
        PUBSUB_TOPIC: your-topic
        # This token is used to verify that requests originate from your
        # application. It can be any sufficiently random string.
        PUBSUB_VERIFICATION_TOKEN: 1234abc

    Revisione del codice

    L'app di esempio utilizza le librerie client di Cloud.

    L'app di esempio utilizza i valori impostati nel file app.yaml per configurare le variabili di ambiente. Il gestore delle richieste push utilizza questi valori per confermare che la richiesta provenga da Pub/Sub e provenga da un'origine attendibile:

    app.config['PUBSUB_VERIFICATION_TOKEN'] = \
        os.environ['PUBSUB_VERIFICATION_TOKEN']
    app.config['PUBSUB_TOPIC'] = os.environ['PUBSUB_TOPIC']
    

    L'app di esempio gestisce un elenco globale per archiviare i messaggi ricevuti da questa istanza:

    MESSAGES = []
    
    Il metodo pubsub_push() riceve i messaggi push e li aggiunge all'elenco globale MESSAGES:

    @app.route('/pubsub/push', methods=['POST'])
    def pubsub_push():
        if (request.args.get('token', '') !=
                current_app.config['PUBSUB_VERIFICATION_TOKEN']):
            return 'Invalid request', 400
    
        envelope = json.loads(request.data.decode('utf-8'))
        payload = base64.b64decode(envelope['message']['data'])
    
        MESSAGES.append(payload)
    
        # Returning any 2xx status indicates successful receipt of the message.
        return 'OK', 200

    Il metodo index() interagisce con l'app web App Engine per pubblicare nuovi messaggi e visualizzare i messaggi ricevuti:

    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'GET':
            return render_template('index.html', messages=MESSAGES)
    
        data = request.form.get('payload', 'Example payload').encode('utf-8')
    
        # publisher = pubsub_v1.PublisherClient()
        topic_path = publisher.topic_path(
            current_app.config['PROJECT'],
            current_app.config['PUBSUB_TOPIC'])
    
        publisher.publish(topic_path, data=data)
    
        return 'OK', 200

    Esecuzione dell'esempio in locale

    Durante l'esecuzione in locale, puoi utilizzare l'interfaccia a riga di comando di Google Cloud per fornire l'autenticazione per utilizzare le API Google Cloud. Supponendo che tu abbia configurato l'ambiente come descritto nei prerequisiti, hai già eseguito il comando gcloud init, che fornisce questa autenticazione.

    Installa le dipendenze, preferibilmente in un ambiente virtuale.

    Mac OS / Linux

    1. Crea un ambiente Python isolato:
      python3 -m venv env
      source env/bin/activate
    2. Se non ti trovi nella directory che contiene il codice di esempio, vai alla directory che contiene il codice di esempio hello_world. Quindi installa le dipendenze:
      cd YOUR_SAMPLE_CODE_DIR
      pip install -r requirements.txt

    Windows

    Utilizza PowerShell per eseguire i pacchetti Python.

    1. Individua l'installazione di PowerShell.
    2. Fai clic con il pulsante destro del mouse sulla scorciatoia di PowerShell e avviala come amministratore.
    3. Crea un ambiente Python isolato.
      python -m venv env
      .\env\Scripts\activate
    4. Naviga alla directory del progetto e installa le dipendenze. Se non ti trovi nella directory contenente il codice di esempio, vai alla directory che contiene il codice di esempio hello_world. Quindi, installa le dipendenze:
      cd YOUR_SAMPLE_CODE_DIR
      pip install -r requirements.txt

    Quindi imposta le variabili di ambiente prima di avviare l'applicazione:

    export GOOGLE_CLOUD_PROJECT=[your-project-id]
    export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
    export PUBSUB_TOPIC=[your-topic]
    python main.py
    

    Simulazione di notifiche push

    L'applicazione può inviare messaggi localmente, ma non è in grado di ricevere messaggi push localmente. Tuttavia, puoi simulare un messaggio push inviando una richiesta HTTP all'endpoint della notifica push locale. Nel file di esempio è incluso sample_message.json.

    Puoi utilizzare un client curl o httpie per inviare una richiesta HTTP POST:

    curl -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"
    

    O

    http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json
    

    Risposta:

    HTTP/1.0 200 OK
    Content-Length: 2
    Content-Type: text/html; charset=utf-8
    Date: Mon, 10 Aug 2015 17:52:03 GMT
    Server: Werkzeug/0.10.4 Python/2.7.10
    
    OK
    

    Al termine della richiesta, puoi aggiornare localhost:8080 e visualizzare il messaggio nell'elenco di messaggi ricevuti.

    Esecuzione in App Engine

    Per eseguire il deployment dell'app demo in App Engine utilizzando lo strumento a riga di comando gcloud, esegui il comando seguente dalla directory in cui si trova il file app.yaml:

    gcloud app deploy
    

    Ora puoi accedere all'applicazione in https://PROJECT_ID.REGION_ID.r.appspot.com. Puoi utilizzare il modulo per inviare messaggi, ma non possiamo garantire quale istanza della tua applicazione riceverà la notifica. Puoi inviare più messaggi e aggiornare la pagina per visualizzare il messaggio ricevuto.