Écrire des messages Pub/Sub et y répondre

Cloud Pub/Sub propose une messagerie asynchrone fiable de type "plusieurs à plusieurs" entre applications. Les applications d'éditeur peuvent envoyer des messages à un sujet et d'autres applications peuvent s'abonner à ce sujet pour recevoir les messages.

Ce document explique comment utiliser la bibliothèque cliente Google Cloud pour envoyer et recevoir des messages Cloud Pub/Sub dans une application exécutée dans l'environnement flexible.

Conditions préalables

  • Suivez les instructions de la section "Hello, World!" pour Python sur App Engine pour configurer votre environnement et votre projet. Ces instructions vous permettront également de comprendre la structure des applications Python dans App Engine.
  • Notez et enregistrez l'ID de votre projet. Vous en aurez besoin pour exécuter l'exemple d'application décrit dans ce document.

    Cloner l'exemple d'application

    Copiez les exemples d'application sur votre ordinateur local et accédez au répertoire pubsub :

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

    Créer un sujet et un abonnement

    Créez un sujet et un abonnement, dans lesquels vous devez spécifier le point de terminaison auquel le serveur Pub/Sub doit envoyer des requêtes :

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

    Remplacez YOUR_TOKEN par un jeton secret aléatoire. Le point de terminaison push l'utilisera pour vérifier les requêtes.

    Modifier le fichier app.yaml

    Modifiez le fichier app.yaml afin de définir les variables d'environnement pour l'ID de projet, le sujet et le jeton de vérification :

    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

    Réviser le code

    L'exemple d'application utilise les bibliothèques clientes Google Cloud.

    Il utilise également les valeurs que vous avez définies dans le fichier app.yaml pour configurer les variables d'environnement. Le gestionnaire de requêtes push utilise ces valeurs pour confirmer que la requête provient de Pub/Sub et qu'une source de confiance en est à l'origine :

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

    L'exemple d'application utilise une liste globale pour stocker les messages que cette instance reçoit :

    MESSAGES = []
    

    La méthode pubsub_push() reçoit les messages envoyés et les ajoute à la liste 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

    La méthode index() interagit avec l'application Web App Engine pour la publication de nouveaux messages et l'affichage des messages reçus :

    @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

    Exécuter l'exemple en local

    Lorsque vous exécutez l'exemple en local, vous pouvez utiliser le SDK Cloud pour assurer l'authentification permettant d'utiliser les API Google Cloud. Si vous avez configuré votre environnement conformément à la procédure décrite dans la section Conditions préalables, vous avez d'ores et déjà exécuté la commande gcloud init, laquelle permet de fournir ce type d'authentification.

    Installez les dépendances, de préférence en utilisant un environnement virtuel (virtualenv).

    macOS/Linux

    1. Créez un environnement Python isolé dans un répertoire externe à votre projet et activez-le :
      virtualenv env
      source env/bin/activate
    2. Accédez au répertoire de votre projet et installez les dépendances :
      cd YOUR_PROJECT
      pip install  -r requirements.txt

    Windows

    Si vous avez installé le SDK Cloud, vous devez déjà disposer de Python 2.7, généralement disponible sous C:\python27_x64\ (pour les systèmes 64 bits). Exécutez les packages Python à l'aide de PowerShell.

    1. Localisez votre installation de PowerShell.
    2. Cliquez avec le bouton droit sur le raccourci PowerShell et démarrez une session en tant qu'administrateur.
    3. Essayez d'exécuter la commande python. Si le dossier Python est introuvable, ajoutez-le à la variable d'environnement PATH.
      $env:Path += ";C:\python27_x64\"
    4. Créez un environnement Python isolé dans un répertoire externe à votre projet et activez-le :
      python -m virtualenv env
      env\Scripts\activate
    5. Accédez au répertoire de votre projet et installez les dépendances :
      cd YOUR_PROJECT
      python -m pip install -r requirements.txt

    Définissez ensuite les variables d'environnement avant de démarrer l'application :

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

    Simuler des notifications push

    L'application peut envoyer des messages en local, mais ne peut pas recevoir de messages push localement. Vous pouvez toutefois simuler un message push en adressant une requête HTTP au point de terminaison de notification push local. L'exemple comprend le fichier sample_message.json.

    Vous pouvez utiliser curl ou httpie pour envoyer une requête HTTP POST :

    curl -i -H "Content-Type: application/json" --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"
    

    Ou

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

    Réponse :

    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
    

    Une fois la requête traitée, vous pouvez actualiser localhost:8080 pour afficher le message dans la liste des messages reçus.

    Exécuter sur App Engine

    Pour déployer l'application de démonstration sur App Engine à l'aide de l'outil de ligne de commande gcloud, exécutez la commande suivante à partir du répertoire où se trouve votre fichier app.yaml :

    gcloud app deploy
    

    Vous pouvez maintenant accéder à l'application à l'adresse https://[YOUR_PROJECT_ID].appspot.com, utiliser le formulaire pour envoyer des messages (mais vous ne pourrez pas forcément savoir quelle instance de votre application recevra la notification), envoyer plusieurs messages et actualiser la page pour afficher le message reçu.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement flexible App Engine pour les documents Python