Cloud Functions se puede activar mediante mensajes publicados en temas de Cloud Pub/Sub en el mismo proyecto de GCP que la función. Cloud Pub/Sub es un bus de mensajes distribuidos global que se escala automáticamente cuando lo necesitas y brinda la base para que compiles tus propios servicios globales sólidos.
Tipos de eventos
Cloud Functions usa un único evento de Cloud Pub/Sub y tiene el valor de tipo de activador google.pubsub.topic.publish
.
Este evento se envía cuando se publica un mensaje en un tema de Cloud Pub/Sub, que se especifica cuando una función está implementada. Cada mensaje publicado en este tema activará la ejecución de la función con el contenido del mensaje pasado como datos de entrada.
Estructura de eventos
Las funciones de Cloud Functions activadas desde un tema de Cloud Pub/Sub se enviarán como eventos que cumplan con el tipo PubsubMessage
, con la advertencia de que publishTime
y messageId
no están disponibles directamente en PubsubMessage
. En cambio, puedes acceder a publishTime
y messageId
a través del ID del evento y las propiedades de marca de tiempo de los metadatos del evento. Se puede acceder a estos metadatos a través del objeto de contexto que se traslada a tu función cuando se invoca.
La carga útil del objeto PubsubMessage
, los datos publicados sobre el tema, se almacena como una string codificada en base64 en el atributo data
de . Para extraer la carga útil del objeto PubsubMessage
, es posible que debas decodificar el atributo de datos, como se muestra en los ejemplos a continuación.
Código de muestra
Node.js 8/10
Node.js 6 (obsoleta)
Python
Go
Publica un mensaje desde una función
También puedes publicar un mensaje en un tema de Pub/Sub desde una función. Esto te permite activar invocaciones posteriores de Cloud Functions con mensajes de Cloud Pub/Sub. Puedes usar esta técnica para lograr los siguientes objetivos:
- Encadenar llamadas a funciones secuenciales juntas
- Distribuir (o "fan-out") grupos de tareas en paralelo en varias instancias de Cloud Functions
En el siguiente ejemplo, una función de HTTP publish
envía un mensaje a un tema de Pub/Sub y, a su vez, activa una función subscribe
.
Este fragmento muestra la función publish
que publica un mensaje en un tema de Pub/Sub:
Node.js
Este fragmento muestra la función subscribe
que se activa cuando el mensaje se publica en el tema de Pub/Sub:
Node.js
En producción, puedes usar la utilidad de línea de comandos cURL para invocar la función publish
, de la siguiente manera:
curl https://GCF_REGION-GCP_PROJECT_ID.cloudfunctions.net/publish -X POST -d "{\"topic\": \"PUBSUB_TOPIC\", \"message\":\"YOUR_MESSAGE\"}" -H "Content-Type: application/json"
Sin embargo, en el caso de las pruebas y la depuración, puedes utilizar el comando gcloud functions call
para llamar a la función directamente.
En los siguientes pasos, se describe cómo ejecutar el ejemplo anterior con el comando gcloud functions call
:
Crea un tema de Pub/Sub, en el que
MY_TOPIC
es el nombre del tema nuevo que estás creando:gcloud pubsub topics create MY_TOPIC
Implementa la función
publish
, en la cualRUNTIME
es el nombre del entorno de ejecución que estás utilizando, comonodejs8
:gcloud functions deploy publish --trigger-http --runtime RUNTIME
Implementa la función
subscribe
:gcloud functions deploy subscribe --trigger-topic MY_TOPIC --runtime RUNTIME
Invoca la función
publish
directamente mediante el comandogcloud functions call
y proporciona los datos obligatorios, como JSON en el argumento--data
:gcloud functions call publish --data '{"topic":"MY_TOPIC","message":"Hello World!"}'
Verifica los registros de la función
subscribe
. Ten en cuenta que los resultados pueden tardar unos minutos en aparecer en el registro:gcloud functions logs read subscribe
Deberías ver un resultado similar a este:
D ...Function execution started I ...{"data":{"message":"Hello World!"}} D ...Function execution took 753 ms, finished with status: 'ok'
Implementa la función
El siguiente comando de gcloud
implementa una función que se activará cuando un mensaje se publique en un tema de Cloud Pub/Sub:
Node.js 8
gcloud functions deploy FUNCTION_NAME --runtime nodejs8 --trigger-topic TOPIC_NAME
Node.js 10 (Beta)
gcloud functions deploy FUNCTION_NAME --runtime nodejs10 --trigger-topic TOPIC_NAME
Node.js 6 (obsoleta)
gcloud functions deploy FUNCTION_NAME --runtime nodejs6 --trigger-topic TOPIC_NAME
Python
gcloud functions deploy FUNCTION_NAME --runtime python37 --trigger-topic TOPIC_NAME
Go
gcloud functions deploy FUNCTION_NAME --runtime go111 --trigger-topic TOPIC_NAME
donde FUNCTION_NAME
es el nombre de la función y TOPIC_NAME
es el nombre del tema de Cloud Pub/Sub al que se suscribirá la función. Si el tema no existe, se crea durante la implementación.
Consulta el instructivo de Cloud Pub/Sub para obtener un ejemplo completo de cómo usar los activadores de Cloud Pub/Sub.
Activadores de Cloud Pub/Sub heredados
El comando de gcloud
a continuación implementa una función que se activa por notificaciones heredadas de Cloud Pub/Sub en un tema específico. Estas notificaciones son compatibles con las funciones heredadas que ya consumen estos eventos. Sin embargo, recomendamos usar la marca --trigger-topic
como alternativa, ya que las notificaciones heredadas podrían quitarse en una fecha futura.
Node.js 8
gcloud functions deploy FUNCTION_NAME --runtime nodejs8 --trigger-resource TOPIC_NAME --trigger-event providers/cloud.pubsub/eventTypes/topic.publish
Node.js 10 (Beta)
gcloud functions deploy FUNCTION_NAME --runtime nodejs10 --trigger-resource TOPIC_NAME --trigger-event providers/cloud.pubsub/eventTypes/topic.publish
Node.js 6 (obsoleta)
gcloud functions deploy FUNCTION_NAME --runtime nodejs6 --trigger-resource TOPIC_NAME --trigger-event providers/cloud.pubsub/eventTypes/topic.publish
Python
gcloud functions deploy FUNCTION_NAME --runtime python37 --trigger-resource TOPIC_NAME --trigger-event providers/cloud.pubsub/eventTypes/topic.publish
Go
gcloud functions deploy FUNCTION_NAME --runtime go111 --trigger-resource TOPIC_NAME --trigger-event providers/cloud.pubsub/eventTypes/topic.publish
Próximos pasos
Consulta el Instructivo de Cloud Pub/Sub para ver un ejemplo sobre cómo implementar una función en segundo plano que se activa mediante Cloud Pub/Sub.