Probar apps de manera local con el emulador

Para desarrollar y probar tu aplicación de forma local, puedes usar el emulador de Pub/Sub, que proporciona la emulación local del servicio de producción de Pub/Sub. Ejecuta el emulador de Pub/Sub con la herramienta de línea de comandos de gcloud.

Para ejecutar tu aplicación en el emulador, primero debes iniciar el emulador y configurar las variables de entorno para que tu aplicación se comunique con el emulador en lugar del servicio de producción de Pub/Sub.

Requisitos

Debes contar los siguientes recursos para usar el emulador de Pub/Sub:

  • El entorno de desarrollo de Python configurado de forma apropiada. Consulta esta guía para obtener más detalles

  • Java JRE (versión 7 o superior) instalado

  • El SDK de Google Cloud instalado. El SDK de Cloud contiene la herramienta de línea de comandos de gcloud

  • Una aplicación que se haya compilado con las bibliotecas cliente de Google Cloud.

Instala el emulador

Instala el emulador desde un símbolo del sistema:

gcloud components install pubsub-emulator
gcloud components update

Inicia el emulador

Para iniciar el emulador, invoca pubsub start desde un símbolo del sistema. Antes de ejecutar el comando, reemplaza PUBSUB_PROJECT_ID con un ID del proyecto de Google Cloud válido. string. La string no necesita representar un proyecto real de Google Cloud porque el emulador de Pub/Sub se ejecuta de manera local.

gcloud beta emulators pubsub start --project=PUBSUB_PROJECT_ID [options]

Consulta gcloud beta emulators pubsub start para obtener una lista completa de las opciones.

Una vez que hayas iniciado el emulador, verás un mensaje similar al siguiente:

...
[pubsub] This is the Pub/Sub fake.
[pubsub] Implementation may be incomplete or differ from the real system.
...
[pubsub] INFO: Server started, listening on 8085

Esto indica que el servidor de Pub/Sub se está ejecutando en el extremo del emulador en tu máquina local y no en el extremo de Google Cloud. Todas las operaciones ocurren de forma local, incluidas las siguientes:

  • La creación de un tema o una suscripción
  • La publicación
  • La suscripción

Configura variables de entorno

Una vez que hayas iniciado el emulador, debes establecer variables de entorno para que tu aplicación se conecte al emulador y no a Pub/Sub. Configura estas variables de entorno en la misma máquina que usas para ejecutar tu aplicación.

Es necesario que configures las variables del entorno cada vez que inicias el emulador. Las variables de entorno dependen de los números de puerto asignados de forma dinámica, que pueden cambiar cuando reinicias el emulador.

Configura las variables de forma automática

Si tu aplicación y el emulador se ejecutan en la misma máquina, puedes configurar las variables del entorno de forma automática:

Linux/macOS

Ejecuta env-init con la sustitución de comandos:

$(gcloud beta emulators pubsub env-init)

Windows

Crea y ejecuta un archivo por lotes con el resultado de env-init:

gcloud beta emulators pubsub env-init > set_vars.cmd && set_vars.cmd

Ahora tu aplicación se conectará al emulador de Pub/Sub.

Configura las variables de forma manual

Si tu aplicación y el emulador se ejecutan en máquinas diferentes, configura las variables de entorno de forma manual:

  1. Ejecuta el comando env-init:

     gcloud beta emulators pubsub env-init

  2. En la máquina que ejecuta la aplicación, establece el valor y la variable de entorno PUBSUB_EMULATOR_HOST como se indica en el resultado del comando env-init. También tienes la opción de configurar la variable de entorno PUBSUB_PROJECT_ID en el proyecto que deseas usar para el emulador, pero solo necesitas configurar PUBSUB_EMULATOR_HOST a fin de que la aplicación se conecte al emulador. Por ejemplo:

    Linux/macOS
    export PUBSUB_EMULATOR_HOST=localhost:8432
    export PUBSUB_PROJECT_ID=my-project-id
    Windows
    set PUBSUB_EMULATOR_HOST=localhost:8432
    set PUBSUB_PROJECT_ID=my-project-id

Ahora tu aplicación se conectará al emulador de Pub/Sub.

Nota: Si estás usando el servidor de desarrollo local del entorno estándar de App Engine para Python, debes pasar las variables de entorno en la línea de comandos como se indica a continuación:

Python

dev_appserver.py app.yaml --env_var PUBSUB_EMULATOR_HOST=${PUBSUB_EMULATOR_HOST}

Usa el emulador

Para usar el emulador, debes tener una aplicación compilada con las bibliotecas cliente de Google Cloud. El emulador no es compatible con Cloud Console ni con los comandos gcloud pubsub.

En el siguiente ejemplo, se muestra cómo crear un tema, además de cómo publicar y leer mensajes con el emulador y una aplicación que use la biblioteca cliente de Google Cloud para Python.

Completa los siguientes pasos en la máquina en la que configuraste las variables de entorno del emulador:

  1. Obtén los ejemplos de Pub/Sub para Python desde GitHub mediante la clonación del repositorio completo de Python. Los ejemplos de Pub/Sub están en el directorio pubsub.

  2. En el repositorio clonado, navega hacia el directorio pubsub/cloud-client. Completaras el resto de los pasos en este directorio.

  3. Desde el directorio pubsub/cloud-client, instala las dependencias necesarias para ejecutar el ejemplo:

    pip install -r requirements.txt
    
  4. Crea un tema:

     python publisher.py PUBSUB_PROJECT_ID create TOPIC_ID
    
  5. Si no tienes un extremo de envío local con el que probar las suscripciones de envío en el emulador, completa los siguientes pasos para crear uno en http://localhost:3000/messages (opcional).

    1. Instala el servidor JSON.
      npm install -g json-server
      
    2. Inicia el servidor JSON.
      json-server --port 3000 --watch db.json
      
      En el ejemplo anterior, db.json contiene el siguiente código de inicio:
      {
         "messages": []
      }
      
    3. Anota http://localhost:3000/messages para PUSH_ENDPOINT en el siguiente paso.
  6. Crea una suscripción al tema:

    • Crea una suscripción de extracción:

      python subscriber.py PUBSUB_PROJECT_ID create TOPIC_ID SUBSCRIPTION_ID
      
    • Crea una suscripción de envío:

      python subscriber.py PUBSUB_PROJECT_ID create-push TOPIC_ID SUBSCRIPTION_ID \
      PUSH_ENDPOINT
      
  7. Publica mensajes en el tema:

     python publisher.py PUBSUB_PROJECT_ID publish TOPIC_ID
    
  8. Lee los mensajes publicados en el tema:

    • Recupera mensajes de tu suscripción de extracción:

      python subscriber.py PUBSUB_PROJECT_ID receive SUBSCRIPTION_ID
      
    • Observa cómo se entregan los mensajes a tu extremo de envío local. Por ejemplo, los mensajes son similar a lo siguiente:

      {
        "messages": [
            {
                "subscription": "projects/PUBSUB_PROJECT_ID/subscriptions/SUBSCRIPTION_ID",
                "message": {
                    "data": "TWVzc2FnZSBudW1iZXIgMQ==",
                    "messageId": "10",
                    "attributes": {}
                },
                "id": 1
            },
            ...
        ]
      }
      

Accede a variables de entorno

En todos los lenguajes, excepto Java y C#, si configuraste PUBSUB_EMULATOR_HOST como se describe en la sección Configura variables de entorno, las bibliotecas cliente de Pub/Sub llaman a la API que se ejecuta en la instancia local de forma automática, y no a Pub/Sub.

Sin embargo, con las bibliotecas cliente de C# y Java, se requiere que modifiques el código para usar el emulador:

C#

Antes de probar este ejemplo, sigue las instrucciones de configuración de C# en la guía de inicio rápido de Cloud Pub/Sub sobre el uso de bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Cloud Pub/Sub para C#.

// For example, "localhost:8615"
string emulatorHostAndPort = Environment.GetEnvironmentVariable("PUBSUB_EMULATOR_HOST");

PublisherServiceApiClient client = new PublisherServiceApiClientBuilder
{
    Endpoint = emulatorHostAndPort,
    ChannelCredentials = ChannelCredentials.Insecure
}.Build();
client.CreateTopic(new TopicName("project", "topic"));
foreach (var topic in client.ListTopics(new ProjectName("project")))
{
    Console.WriteLine(topic.Name);
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración de Java en la guía de inicio rápido de Cloud Pub/Sub sobre el uso de bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Cloud Pub/Sub para Java.

String hostport = System.getenv("PUBSUB_EMULATOR_HOST");
ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build();
try {
  TransportChannelProvider channelProvider =
      FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel));
  CredentialsProvider credentialsProvider = NoCredentialsProvider.create();

  // Set the channel and credentials provider when creating a `TopicAdminClient`.
  // Similarly for SubscriptionAdminClient
  TopicAdminClient topicClient =
      TopicAdminClient.create(
          TopicAdminSettings.newBuilder()
              .setTransportChannelProvider(channelProvider)
              .setCredentialsProvider(credentialsProvider)
              .build());

  ProjectTopicName topicName = ProjectTopicName.of("my-project-id", "my-topic-id");
  // Set the channel and credentials provider when creating a `Publisher`.
  // Similarly for Subscriber
  Publisher publisher =
      Publisher.newBuilder(topicName)
          .setChannelProvider(channelProvider)
          .setCredentialsProvider(credentialsProvider)
          .build();
} finally {
  channel.shutdown();
}

Detén el emulador

Para detener el emulador, presiona Control + C.

Una vez que el emulador esté detenido, ejecuta el siguiente comando con el fin de quitar la variable de entorno PUBSUB_EMULATOR_HOST para que la aplicación se conecte a Pub/Sub:

Linux/macOS
unset PUBSUB_EMULATOR_HOST
Windows
set PUBSUB_EMULATOR_HOST=

Argumentos de línea de comandos del emulador

Para obtener detalles sobre los argumentos de la línea de comandos del emulador de Pub/Sub, consulta gcloud beta emulators pubsub.

Limitaciones conocidas

  • Por el momento, no se admiten las RPC de UpdateTopic y UpdateSnapshot.
  • No se admiten operaciones de IAM por el momento.
  • No se admite la retención de mensajes configurable; todos los mensajes se retienen por tiempo indefinido.
  • No se admite la expiración de suscripciones. Las suscripciones no expiran.

Para informar sobre algún problema, visita el foro de Pub/Sub.