Funciones en segundo plano

Utiliza las funciones en segundo plano cuando quieras que Cloud Functions se invoque indirectamente en respuesta a un evento, como un mensaje en un tema de Cloud Pub/Sub, un cambio en un depósito de Cloud Storage o un evento de Firebase.

Para obtener información sobre cómo reintentar funciones en segundo plano, consulta Reintenta las funciones en segundo plano.

Ejemplo de uso

Los siguientes ejemplos muestran cómo procesar eventos desde Cloud Pub/Sub y Cloud Storage. Para obtener más información sobre el manejo de eventos de diferentes fuentes, consulta Llama a Cloud Functions.

Ejemplo de Cloud Pub/Sub

En este ejemplo, se muestra una función de Cloud Functions activada por eventos de Cloud Pub/Sub. Cada vez que se publica un mensaje en un tema de Cloud Pub/Sub, se invoca la función y se escribe un saludo en el registro con los datos derivados del mensaje.

Node.js 8/10

/**
 * 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} pubSubEvent The event payload.
 * @param {object} context The event metadata.
 */
exports.helloPubSub = (pubSubEvent, context) => {
  const name = pubSubEvent.data
    ? Buffer.from(pubSubEvent.data, 'base64').toString()
    : 'World';

  console.log(`Hello, ${name}!`);
};

Node.js 6 (obsoleto)

/**
 * 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} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */
exports.helloPubSub = (event, callback) => {
  const pubsubMessage = event.data;
  const name = pubsubMessage.data
    ? Buffer.from(pubsubMessage.data, 'base64').toString()
    : 'World';

  console.log(`Hello, ${name}!`);

  callback();
};

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)
	if name == "" {
		name = "World"
	}
	log.Printf("Hello, %s!", name)
	return nil
}

Para obtener más información sobre la implementación de funciones de Cloud Functions activadas por los eventos de Cloud Pub/Sub, consulta los activadores de Cloud Pub/Sub y el instructivo de Cloud Pub/Sub.

Ejemplo de Cloud Storage

En este ejemplo, se muestra una función de Cloud Functions activada por eventos de Cloud Storage. Cada vez que se crea un objeto en un depósito de Cloud Storage, se invoca la función y en el registro se escribe un mensaje sobre el cambio.

Node.js 8/10

/**
 * Background Cloud Function to be triggered by Cloud Storage.
 *
 * @param {object} data The event payload.
 * @param {object} context The event metadata.
 */
exports.helloGCS = (data, context) => {
  const file = data;
  if (file.resourceState === 'not_exists') {
    console.log(`File ${file.name} deleted.`);
  } else if (file.metageneration === '1') {
    // metageneration attribute is updated on metadata changes.
    // on create value is 1
    console.log(`File ${file.name} uploaded.`);
  } else {
    console.log(`File ${file.name} metadata updated.`);
  }
};

Node.js 6 (obsoleto)

/**
 * Background Cloud Function to be triggered by Cloud Storage.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */
exports.helloGCS = (event, callback) => {
  const file = event.data;

  if (file.resourceState === 'not_exists') {
    console.log(`File ${file.name} deleted.`);
  } else if (file.metageneration === '1') {
    // metageneration attribute is updated on metadata changes.
    // value is 1 if file was newly created or overwritten
    console.log(`File ${file.name} uploaded.`);
  } else {
    console.log(`File ${file.name} metadata updated.`);
  }

  callback();
};

Python

def hello_gcs(data, context):
    """Background Cloud Function to be triggered by Cloud Storage.
    Args:
         data (dict): The dictionary with data specific to this type of event.
         context (google.cloud.functions.Context): The Cloud Functions
         event metadata.
    """
    print("File: {}.".format(data['objectId']))

Go


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
	"context"
	"log"
)

// GCSEvent is the payload of a GCS event.
type GCSEvent struct {
	Bucket         string `json:"bucket"`
	Name           string `json:"name"`
	Metageneration string `json:"metageneration"`
	ResourceState  string `json:"resourceState"`
}

// HelloGCS consumes a GCS event.
func HelloGCS(ctx context.Context, e GCSEvent) error {
	if e.ResourceState == "not_exists" {
		log.Printf("File %v deleted.", e.Name)
		return nil
	}
	if e.Metageneration == "1" {
		// The metageneration attribute is updated on metadata changes.
		// The on create value is 1.
		log.Printf("File %v created.", e.Name)
		return nil
	}
	log.Printf("File %v metadata updated.", e.Name)
	return nil
}

Para obtener más información sobre cómo implementar funciones de Cloud Functions activadas por eventos de Cloud Storage, consulta Activadores de Cloud Storage y el Instructivo de Cloud Storage.

Parámetros de las funciones

Las funciones en segundo plano reciben argumentos que poseen datos asociados con el evento que activó la ejecución de la función. Los parámetros de las funciones en segundo plano se describen a continuación:

Node.js 8/10

En los entornos de ejecución de Node.js 8 y Node.js 10, tu función recibe los argumentos (data, context, callback):

Propiedad Descripción Tipo
data El objeto de datos para el evento. Su tipo depende del evento. Objeto de Cloud Storage o PubsubMessage
context El objeto de contexto del evento. Objeto
context.eventId Un ID único para el evento. Por ejemplo: "70172329041928". String
context.timestamp La fecha/hora en la que se creó este evento. Por ejemplo: "2018-04-09T07:56:12.975Z". String (ISO 8601)
context.eventType El tipo de evento. Por ejemplo: "google.pubsub.topic.publish". String
context.resource El recurso que emitió el evento. String
callback

Una devolución de llamada para indicar que la ejecución de la función se completó. Sigue la convención de “errback” que interpreta el primer argumento como un error.


callback();                    // Success
callback(null, 'Success!');    // Success
callback(1);                   // Error
callback(new Error('Failed')); // Error
Función

Node.js 6 (obsoleto)

En el entorno de ejecución de Node.js 6, tu función recibe los argumentos (event, callback):

Propiedad Descripción Tipo
event Un objeto que representa el evento que activó la función. Objeto
event.data El objeto de datos para el evento. Su tipo depende del evento. Objeto de Cloud Storage o PubsubMessage
event.context El objeto de contexto del evento. Objeto
event.context.eventId Un ID único para el evento. Por ejemplo: "70172329041928". String
event.context.timestamp La fecha/hora en la que se creó este evento. Por ejemplo: "2018-04-09T07:56:12.975Z". String (ISO 8601)
event.context.eventType El tipo de evento. Por ejemplo: "google.pubsub.topic.publish". String
event.context.resource El recurso que emitió el evento. String
callback

Una devolución de llamada para indicar que la ejecución de la función se completó. Sigue la convención de “errback” que interpreta el primer argumento como un error.


callback();                    // Success
callback(null, 'Success!');    // Success
callback(1);                   // Error
callback(new Error('Failed')); // Error
Función

Python

En el entorno de ejecución de Python, tu función recibe los argumentos (data, context):

Propiedad Descripción Tipo
data Un diccionario que contiene los datos de un evento. Su formato depende del evento. Objeto de Cloud Storage o PubsubMessage
context El objeto de contexto del evento. Contexto
context.event_id Un ID único para el evento. Por ejemplo: "70172329041928". String
context.timestamp La fecha/hora en la que se creó este evento. Por ejemplo: "2018-04-09T07:56:12.975Z". String (ISO 8601)
context.event_type El tipo de evento. Por ejemplo: "google.pubsub.topic.publish". String
context.resource El recurso que emitió el evento. String

Go

En el entorno de ejecución de Go, tu función recibe los argumentos (ctx, Event):

Propiedad Descripción Tipo
ctx Un valor context.Context que transporta metadatos sobre el evento. Puedes recuperar los metadatos mediante el paquete cloud.google.com/go/functions/metadata . context.Context
Event

Un struct, cuyo tipo defines tú, en el que se deserializará la carga útil del evento en json.Unmarshal() . La carga útil del evento depende del activador para el cual se registró la función.

La definición de struct que proporciones en tu código debe corresponder a la estructura del tipo de evento. La estructura para cada evento se documenta en la página del activador del evento correspondiente.

Ten en cuenta que tu struct no es necesario para definir todos los campos contenidos en la carga útil. Quizás solo debes usar ciertos campos en tu función, en cuyo caso solo necesitas definir esos campos en tu struct. También puedes volver a nombrar el campo (por ejemplo, cuando el nombre del campo JSON contiene un guion bajo) con etiquetas JSON en ese campo.

struct definido por el usuario

Los datos del evento dependen del activador para el que se registró la función, por ejemplo, Cloud Pub/Sub o Cloud Storage. En el caso de funciones que se activaron de forma directa a través del comando gcloud functions call, los datos del evento contienen el mensaje que enviaste directamente.

Finaliza funciones en segundo plano

Debes indicar cuándo se han completado las funciones en segundo plano. De lo contrario, tu función puede seguir ejecutándose y el sistema podría forzar su finalización. Puedes indicar la finalización de la función en cada entorno de ejecución, como se describe a continuación:

Node.js 8/10

En los entornos de ejecución de Node.js 8 y Node.js 10, indica la finalización de la función de alguna de las siguientes formas:

  • Invoca el argumento callback.
  • Muestra una promesa.
  • Ajusta tu función a través de la palabra clave async (lo que hace que tu función muestre implícitamente una promesa).
  • Muestra un valor.

Si invocas el argumento callback o si muestras un valor de forma sincrónica, asegúrate de que todos los procesos asíncronos se hayan completado primero. Si muestras una promesa, Cloud Functions se asegura de que esta se establezca antes de finalizar.

La siguiente función de ejemplo muestra una promesa:

const fetch = require('node-fetch');

/**
 * Background Cloud Function that returns a Promise. Note that we don't pass
 * a "callback" argument to the function.
 *
 * @param {object} data The Cloud Functions event data.
 * @returns {Promise}
 */
exports.helloPromise = data => {
  return fetch(data.endpoint);
};

La siguiente función de ejemplo no usa llamadas asíncronas, de manera que puede mostrar un valor de manera síncrona:

/**
 * Background Cloud Function that returns synchronously. Note that we don't pass
 * a "callback" argument to the function.
 *
 * @param {object} data The Cloud Functions event data.
 */
exports.helloSynchronous = data => {
  // This function returns synchronously
  if (data.something === true) {
    return 'Something is true!';
  } else {
    throw new Error('Something was not true!');
  }
};

Node.js 6 (obsoleto)

En el entorno de ejecución de Node.js 6, indica la finalización de la función de alguna de las siguientes formas:

  • Invoca el argumento callback.
  • Muestra una promesa.
  • Muestra un valor.

Si invocas el argumento callback o si muestras un valor de forma sincrónica, asegúrate de que todos los procesos asíncronos se hayan completado primero. Si muestras una promesa, Cloud Functions se asegura de que esta se establezca antes de finalizar.

La siguiente función de ejemplo muestra una promesa:

const requestPromiseNative = require('request-promise-native');

/**
 * Background Cloud Function that returns a Promise. Note that we don't pass
 * a "callback" argument to the function.
 *
 * @param {object} event The Cloud Functions event.
 * @param {object} event.data The event data.
 * @returns {Promise}
 */
exports.helloPromise = event => {
  return requestPromiseNative({
    uri: event.data.endpoint,
  });
};

La siguiente función de ejemplo no usa llamadas asíncronas, de manera que puede mostrar un valor de manera síncrona:

/**
 * Background Cloud Function that returns synchronously. Note that we don't pass
 * a "callback" argument to the function.
 *
 * @param {object} event The Cloud Functions event.
 * @param {object} event.data The event data.
 */
exports.helloSynchronous = event => {
  // This function returns synchronously
  if (event.data.something === true) {
    return 'Something is true!';
  } else {
    throw new Error('Something was not true!');
  }
};

Python

En el entorno de ejecución de Python, indica la finalización de la función con solo mostrar un valor:

def hello_background(data, context):
    """Background Cloud Function.
    Args:
         data (dict): The dictionary with data specific to the given event.
         context (google.cloud.functions.Context): The Cloud Functions event
         metadata.
    """
    if data and 'name' in data:
        name = data['name']
    else:
        name = 'World'
    return 'Hello {}!'.format(name)

Go

En el entorno de ejecución de Go, indica la finalización de la función con solo mostrar un valor:


// 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)
	if name == "" {
		name = "World"
	}
	log.Printf("Hello, %s!", name)
	return nil
}

Próximos pasos

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Cloud Functions