Compila un sistema de Pub/Sub de uno a varios

En este instructivo, se explica cómo configurar un conjunto de aplicaciones que se comunican mediante el envío de mensajes a través de Pub/Sub en lugar de RPC síncronas. Si se separan las aplicaciones, sucede lo siguiente con la mensajería:

  • Hace que las aplicaciones sean más sólidas.
  • Podría simplificarse el desarrollo.

Por ejemplo, el emisor (publicador) no necesita que el destinatario (suscriptor) esté activo y disponible. Solo envía un mensaje a Pub/Sub. El publicador tampoco necesita saber cuáles y cuántas aplicaciones de suscriptor necesitan recibir el mensaje. Como resultado, se puede confiar en que el servicio entregará el mensaje a una o más aplicaciones de suscriptor cuando estén disponibles.

Descripción general del sistema

En este instructivo, iniciarás una aplicación de publicador que envíe el mensaje “Hello, World!” a dos suscriptores mediante la comunicación uno a varios, como se ilustra en el siguiente diagrama:

Diagrama del tema, sus suscripciones adjuntas y las aplicaciones de publicador y de suscriptor que envían mensajes a Cloud Pub/Sub, además de recibir mensajes de este servicio.

Las dos aplicaciones de suscriptor usan el mismo código, pero se las debe iniciar en diferentes momentos. Con este proceso, se demuestra cómo Pub/Sub habilita la comunicación asíncrona. Para compilar este sistema, completa los siguientes pasos:

  1. Crea una cuenta de servicio de IAM que las aplicaciones usen para la autenticación.
  2. Configura los permisos de IAM.
  3. Crear un tema y una suscripción de Pub/Sub
  4. Iniciar tres aplicaciones independientes: una de publicador y dos de suscriptor

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. Instala Google Cloud CLI.
  3. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  4. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  5. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  6. Habilita la API de Pub/Sub:

    gcloud services enable pubsub.googleapis.com
  7. Crea credenciales de autenticación locales para tu Cuenta de Google:

    gcloud auth application-default login
  8. Otorga roles a tu Cuenta de Google. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Reemplaza PROJECT_ID con el ID del proyecto.
    • Reemplaza EMAIL_ADDRESS por tu dirección de correo electrónico.
    • Reemplaza ROLE por cada rol individual.
  9. Instala Google Cloud CLI.
  10. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  11. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  12. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  13. Habilita la API de Pub/Sub:

    gcloud services enable pubsub.googleapis.com
  14. Crea credenciales de autenticación locales para tu Cuenta de Google:

    gcloud auth application-default login
  15. Otorga roles a tu Cuenta de Google. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Reemplaza PROJECT_ID con el ID del proyecto.
    • Reemplaza EMAIL_ADDRESS por tu dirección de correo electrónico.
    • Reemplaza ROLE por cada rol individual.

Instala Python

En este instructivo, se usan las bibliotecas cliente de Pub/Sub, que requieren Python 3.7 o versiones posteriores. Completa las instrucciones para instalar Python.

Configura tu proyecto de Pub/Sub

Para administrar el flujo de mensajes entre la publicación y la suscripción de aplicaciones, debes crear un tema y dos suscripciones diferentes.

Crear un tema de Pub/Sub

Crea un tema con el ID hello_topic:

gcloud pubsub topics create hello_topic

Crea suscripciones a Pub/Sub

Crea dos suscripciones y adjúntalas a tu tema.

Estas suscripciones son una suscripción StreamingPull, que es un tipo de suscripción pull.

Suscripción 1

Crea una suscripción con el ID sub_one y adjúntala a hello_topic.

gcloud pubsub subscriptions create sub_one --topic=hello_topic

Suscripción 2

Crea una suscripción con el ID sub_two y adjúntala a hello_topic.

gcloud pubsub subscriptions create sub_two --topic=hello_topic

Compila el sistema de uno a varios

Descarga el código de publicador y de suscriptor

  1. Descarga los archivos de Python de Pub/Sub necesarios para este instructivo.

     git clone https://github.com/googleapis/python-pubsub.git
    
  2. Cierra cualquier terminal abierta antes de continuar.

Configura tres terminales

  1. Inicia una terminal para cada aplicación de guía de inicio rápido (una de publicador y dos de suscriptor). Para mayor comodidad, en este instructivo, se llama a estas terminales:

    • terminal publisher
    • terminal sub_one
    • terminal sub_two
  2. En la terminal del publicador, crea y activa un entorno virtual de Python llamado pyenv-qs.

    Bash

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

    PowerShell

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

    En las terminales sub_one y sub_two, ejecuta el siguiente comando:

    Bash

    source pyenv-qs/bin/activate
    

    PowerShell

    .\pyenv-qs\Scripts\activate
    

    Después de ejecutar el comando de activación, el símbolo del sistema incluye el siguiente valor (pyenv-qs) $.

  3. En la terminal de publisher, instala la biblioteca cliente de Pub/Sub para Python con pip:

    python -m pip install --upgrade google-cloud-pubsub
  4. En las tres terminales, configura una variable de entorno con el ID del proyecto actual. Este comando de gcloud determina el ID del proyecto seleccionado y lo establece como una variable:

    Bash

    export PROJECT=`gcloud config get-value project`
    

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
    
  5. En las tres terminales, cambia a la ruta de acceso del proyecto que contiene el código de muestra.

    cd python-pubsub/samples/snippets/quickstart/
    

Inicia las apps y observa el flujo de mensajes

Inicia la aplicación Subscriber 1

En la terminal sub_one, inicia Subscriber 1:

Bash

python sub.py $PROJECT sub_one

PowerShell

py sub.py $env:PROJECT sub_one

Una vez iniciada, esta aplicación abre una conexión de transmisión bidireccional con el servidor. Pub/Sub entrega mensajes a través de la transmisión.

La aplicación Subscriber 1 se pone a la escucha de mensajes en la suscripción sub_one.

Inicia la aplicación Publisher

En la terminal publisher, inicia la aplicación Publisher:

Bash

python pub.py $PROJECT hello_topic

PowerShell

py pub.py $env:PROJECT hello_topic

Una vez que se inicia la aplicación de publicador, el sistema de Pub/Sub hace lo siguiente:

  • La aplicación Publisher envía el mensaje “Hello, World!” a Pub/Sub sin tener en cuenta las suscripciones existentes. La aplicación también asigna un ID de mensaje.

  • La aplicación Subscriber 1 recibe el mensaje “Hello, World!”, lo muestra y envía una confirmación de recepción a Pub/Sub.

  • La aplicación Publisher muestra la confirmación de recepción. La confirmación de recepción le indica a Pub/Sub que el mensaje se procesó con éxito y no necesita reenviarse a este o cualquier otro suscriptor de sub_one.

Pub/Sub quita el mensaje de sub_one.

La aplicación Publisher publica el mensaje y le asigna un ID de mensaje. La aplicación Subscriber 1 recibe el mensaje “Hello, World!” y envía una confirmación de recepción

Inicia la aplicación Subscriber 2

En la terminal sub_two, inicia Subscriber 2:

Bash

python sub.py $PROJECT sub_two

PowerShell

py sub.py $env:PROJECT sub_two

Este suscriptor recibe mensajes entregados a la suscripción sub_two. Subscriber 2 vuelve a usar la secuencia de comandos sub.py. La diferencia es que Subscriber 2 no se inicia hasta que Publisher haya enviado el mensaje al tema y las suscripciones. Si Publisher llamara directamente a la aplicación Subscriber 2, la aplicación de publicación tendría que esperar hasta que apareciera Subscriber 2 o tendría que agotar el tiempo de espera. Pub/Sub administra este proceso. Para ello, guarda el mensaje destinado a Subscriber 2.

Subscriber 2 se pone a la escucha y recibe el mensaje que estaba guardado en sub_two

Ahora estás listo para desarrollar con Pub/Sub.

¿Cómo fue?

Hay recursos y vínculos adicionales disponibles en la página de asistencia de Pub/Sub.

Limpia

  1. Detén todas las aplicaciones en ejecución.
  2. Borra el directorio del código de muestra de tu entorno local.
  3. Borra el tema.

    gcloud pubsub topics delete hello_topic
    
  4. Borra las suscripciones.

    gcloud pubsub subscriptions delete sub_one
    
    gcloud pubsub subscriptions delete sub_two
    
  5. Cierra el proyecto del instructivo en la sección IAM y administración de la consola de Google Cloud.

  6. Opcional: Revoca las credenciales de autenticación que creaste y borra el archivo local de credenciales.

    gcloud auth application-default revoke
  7. Opcional: Revoca credenciales desde gcloud CLI.

    gcloud auth revoke

¿Qué sigue?

Puedes probar algunas de estas opciones:

  • Examina los códigos pub.py y sub.py del instructivo y explora otras muestras de Pub/Sub en GitHub. Como ejercicio, crea una versión de pub.py que publique la hora local cada segundo.

  • Aprende a agrupar mensajes por lotes.

  • Con las suscripciones de envío, recibe mensajes que activen los extremos de App Engine o Cloud Functions.

  • Recupera mensajes confirmados como recibidos con anterioridad mediante la reproducción. De forma predeterminada, Pub/Sub quita los mensajes confirmados como recibidos de las suscripciones. En este instructivo, por ejemplo, no podrás volver a ejecutar sub.py para recibir el mensaje “Hello, World!” de nuevo. La función de reproducción te permite configurar suscripciones para que puedas recibir mensajes después de que se hayan confirmado.

  • Comienza a usar bibliotecas cliente en otros lenguajes.