Instructivo de Cloud Pub/Sub

En este instructivo simple, se muestra cómo escribir, implementar y activar una función de Cloud Functions en segundo plano con un activador de Cloud Pub/Sub.

Si recién comienzas a usar Pub/Sub y quieres obtener más información, consulta la documentación de Pub/Sub, en particular, cómo administrar temas y suscripciones. Consulta Activadores de Google Cloud Pub/Sub para obtener una descripción general del trabajo con suscripciones y temas de Pub/Sub en Cloud Functions.

Objetivos

Costos

En este instructivo, se usan componentes facturables de Cloud Platform, incluidos los siguientes:

  • Cloud Functions
  • Pub/Sub

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.

Los usuarios nuevos de Cloud Platform pueden optar por una prueba gratuita.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Habilita las API de Cloud Functions, Cloud Build, and Cloud Pub/Sub.

    Habilita las API

  5. Instala y, luego, inicializa el SDK de Cloud.
  6. Actualiza los componentes de gcloud:
    gcloud components update
  7. Prepara tu entorno de desarrollo.

Prepara la aplicación

  1. Clona el repositorio de la app de muestra en tu máquina local:

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    De manera opcional, puedes descargar la muestra como un archivo ZIP y extraerla.

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    De manera opcional, puedes descargar la muestra como un archivo ZIP y extraerla.

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git

    De manera opcional, puedes descargar la muestra como un archivo ZIP y extraerla.

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git

    De manera opcional, puedes descargar la muestra como un archivo ZIP y extraerla.

  2. Ve al directorio que contiene el código de muestra de Cloud Functions para acceder a Pub/Sub:

    Node.js

    cd nodejs-docs-samples/functions/helloworld/

    Python

    cd python-docs-samples/functions/helloworld/

    Go

    cd golang-samples/functions/helloworld/

    Java

    cd java-docs-samples/functions/helloworld/hello-pubsub/

  3. Ve el código de muestra:

    Node.js

    /**
     * Background Cloud Function to be triggered by Pub/Sub.
     * This function is exported by index.js, and executed when
     * the trigger topic receives a message.
     *
     * @param {object} message The Pub/Sub message.
     * @param {object} context The event metadata.
     */
    exports.helloPubSub = (message, context) => {
      const name = message.data
        ? Buffer.from(message.data, 'base64').toString()
        : 'World';
    
      console.log(`Hello, ${name}!`);
    };

    Python

    def hello_pubsub(event, context):
        """Background Cloud Function to be triggered by Pub/Sub.
        Args:
             event (dict):  The dictionary with data specific to this type of
             event. The `data` field contains the PubsubMessage message. The
             `attributes` field will contain custom attributes if there are any.
             context (google.cloud.functions.Context): The Cloud Functions event
             metadata. The `event_id` field contains the Pub/Sub message ID. The
             `timestamp` field contains the publish time.
        """
        import base64
    
        print("""This Function was triggered by messageId {} published at {}
        """.format(context.event_id, context.timestamp))
    
        if 'data' in event:
            name = base64.b64decode(event['data']).decode('utf-8')
        else:
            name = 'World'
        print('Hello {}!'.format(name))

    Go

    
    // Package helloworld provides a set of Cloud Functions samples.
    package helloworld
    
    import (
    	"context"
    	"log"
    )
    
    // PubSubMessage is the payload of a Pub/Sub event.
    type PubSubMessage struct {
    	Data []byte `json:"data"`
    }
    
    // HelloPubSub consumes a Pub/Sub message.
    func HelloPubSub(ctx context.Context, m PubSubMessage) error {
    	name := string(m.Data) // Automatically decoded from base64.
    	if name == "" {
    		name = "World"
    	}
    	log.Printf("Hello, %s!", name)
    	return nil
    }
    

    Java

    
    import com.google.cloud.functions.BackgroundFunction;
    import com.google.cloud.functions.Context;
    import functions.eventpojos.PubSubMessage;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class HelloPubSub implements BackgroundFunction<PubSubMessage> {
      private static final Logger logger = Logger.getLogger(HelloPubSub.class.getName());
    
      @Override
      public void accept(PubSubMessage message, Context context) {
        String name = "world";
        if (message != null && message.getData() != null) {
          name = new String(
              Base64.getDecoder().decode(message.getData().getBytes(StandardCharsets.UTF_8)),
              StandardCharsets.UTF_8);
        }
        logger.info(String.format("Hello %s!", name));
        return;
      }
    }

Implementa la función

Para implementar la función con un activador de Pub/Sub, ejecuta el siguiente comando en el directorio que contiene el código de muestra (o en el caso de Java, el archivo pom.xml):

Node.js

gcloud functions deploy helloPubSub \
--runtime nodejs10 \
--trigger-topic YOUR_TOPIC_NAME
Puedes usar los siguientes valores para que la marca --runtime especifique tu versión preferida de Node.js:
  • nodejs10
  • nodejs12

Python

gcloud functions deploy hello_pubsub \
--runtime python37 \
--trigger-topic YOUR_TOPIC_NAME
Puedes usar los siguientes valores para que la marca --runtime especifique tu versión preferida de Python:
  • python37
  • python38

Go

gcloud functions deploy HelloPubSub \
--runtime go111 \
--trigger-topic YOUR_TOPIC_NAME
Puedes usar los siguientes valores en la marca --runtime para especificar tu versión preferida de Go:
  • go111
  • go113

Java

gcloud functions deploy java-pubsub-function \
--entry-point functions.HelloPubSub \
--runtime java11 \
--memory 512MB \
--trigger-topic YOUR_TOPIC_NAME

En los ejemplos anteriores, YOUR_TOPIC_NAME es el nombre del tema de Pub/Sub al que se suscribirá la función.

Si YOUR_TOPIC_NAME aún no existe, este comando lo creará. También puedes crear un tema antes de ejecutar el comando deploy, mediante Cloud Console o el siguiente comando de gcloud:

gcloud pubsub topics create YOUR_TOPIC_NAME

Activa la función

  1. Publica un mensaje en el tema de Pub/Sub. En este ejemplo, el mensaje es un nombre que la función incluirá en un saludo:

    gcloud pubsub topics publish YOUR_TOPIC_NAME --message YOUR_NAME

    Reemplaza YOUR_TOPIC_NAME por el nombre de tu tema de Pub/Sub, y YOUR_NAME por una string arbitraria.

  2. Revisa los registros para asegurarte de que las ejecuciones se completaron:

    gcloud functions logs read --limit 50
    

También puedes publicar un mensaje en un tema de Pub/Sub desde una función.

Realiza una limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, sigue estos pasos:

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a la página Administrar recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrar el proyecto.

Borra la función de Cloud Functions

Borrar las funciones de Cloud Functions no quita ningún recurso almacenado en Cloud Storage.

Para borrar la función de Cloud Functions que creaste en este instructivo, ejecuta el siguiente comando:

Node.js

gcloud functions delete helloPubSub 

Python

gcloud functions delete hello_pubsub 

Go

gcloud functions delete HelloPubSub 

Java

gcloud functions delete java-pubsub-function 

También puedes borrar Cloud Functions en Google Cloud Console.