Trabajar con funciones remotas
Una función remota de BigQuery te permite implementar tu función en otros lenguajes que no sean SQL ni JavaScript, o con las bibliotecas o los servicios que no se permiten en las funciones definidas por el usuario de BigQuery.
Información general
Una función remota de BigQuery te permite incorporar funciones de GoogleSQL con software externo a BigQuery proporcionando una integración directa con Cloud Run Functions y Cloud Run. Con las funciones remotas de BigQuery, puedes desplegar tus funciones en Cloud Run Functions o en Cloud Run implementado con cualquier lenguaje compatible y, a continuación, invocarlas desde consultas de GoogleSQL.
Flujo de trabajo
- Crea el endpoint HTTP en Cloud Run Functions o Cloud Run.
- Crea una función remota en BigQuery.
- Crea una conexión de tipo
CLOUD_RESOURCE
. - Crea una función remota.
- Crea una conexión de tipo
- Usa la función remota en una consulta como cualquier otra función definida por el usuario.
Limitaciones
Las funciones remotas solo admiten uno de los siguientes tipos de datos como tipo de argumento o tipo de valor devuelto:
- Booleano
- Bytes
- Numérico
- Cadena
- Fecha
- Fecha y hora
- Hora
- Marca de tiempo
- JSON
Las funciones remotas no admiten los tipos
ARRAY
,STRUCT
,INTERVAL
niGEOGRAPHY
.No puedes crear funciones remotas con valores de tabla.
No puedes usar funciones remotas al crear vistas materializadas.
Siempre se presupone que el valor devuelto de una función remota no es determinista, por lo que el resultado de una consulta que llama a una función remota no se almacena en caché.
Es posible que vea solicitudes repetidas con los mismos datos a su endpoint, incluso después de que se hayan enviado correctamente, debido a errores de red transitorios o a errores internos de BigQuery.
Cuando se omite la evaluación de una función remota en algunas filas debido a un cortocircuito (por ejemplo, en expresiones condicionales o en una instrucción
MERGE
conWHEN [NOT] MATCHED
), no se usa el procesamiento por lotes con la función remota. En este caso, el campocalls
del cuerpo de la solicitud HTTP tiene exactamente un elemento.Si el conjunto de datos asociado a la función remota se replica en una región de destino mediante la replicación de conjuntos de datos entre regiones, la función remota solo se podrá consultar en la región en la que se haya creado.
Crear un punto final
Para crear una función remota que pueda implementar lógica empresarial, debes crear un endpoint HTTP mediante funciones de Cloud Run o Cloud Run. El endpoint debe poder procesar un lote de filas en una sola solicitud POST HTTP y devolver los resultados del lote como respuesta HTTP.
Si creas la función remota con DataFrames de BigQuery, no tienes que crear manualmente el endpoint HTTP, ya que el servicio lo hace automáticamente.
Consulta el tutorial de Cloud Run Functions y otra documentación de Cloud Run Functions sobre cómo escribir, desplegar, probar y mantener una función de Cloud Run.
Consulta la guía de inicio rápido de Cloud Run y otra documentación de Cloud Run sobre cómo escribir, desplegar, probar y mantener un servicio de Cloud Run.
Te recomendamos que mantengas la autenticación predeterminada en lugar de permitir la invocación no autenticada de tu función o servicio de Cloud Run.
Formato de entrada
BigQuery envía solicitudes HTTP POST con un cuerpo JSON en el siguiente formato:
Nombre del campo | Descripción | Tipo de campo |
---|---|---|
requestId | ID de la solicitud. Único en varias solicitudes enviadas a este endpoint en una consulta de GoogleSQL. | Siempre se proporciona. Cadena. |
llamador | Nombre completo del recurso de trabajo de la consulta de GoogleSQL que llama a la función remota. | Siempre se proporciona. Cadena. |
sessionUser | Correo del usuario que ejecuta la consulta de GoogleSQL. | Siempre se proporciona. Cadena. |
userDefinedContext | El contexto definido por el usuario que se usó al crear la función remota en BigQuery. | Opcional. Un objeto JSON con pares clave-valor. |
llamadas | Un lote de datos de entrada. | Siempre se proporciona. Una matriz JSON.
Cada elemento es una matriz JSON, que es una lista de argumentos codificada en JSON de una llamada a una función remota. |
Ejemplo de solicitud:
{
"requestId": "124ab1c",
"caller": "//bigquery.googleapis.com/projects/myproject/jobs/myproject:US.bquxjob_5b4c112c_17961fafeaf",
"sessionUser": "test-user@test-company.com",
"userDefinedContext": {
"key1": "value1",
"key2": "v2"
},
"calls": [
[null, 1, "", "abc"],
["abc", "9007199254740993", null, null]
]
}
Formato de salida
BigQuery espera que el endpoint devuelva una respuesta HTTP con el siguiente formato. De lo contrario, BigQuery no podrá consumirla y la consulta que llame a la función remota fallará.
Nombre del campo | Descripción | Intervalo de valores |
respuestas | Un lote de valores devueltos. | Es obligatorio para que la respuesta sea correcta. Una matriz JSON.
Cada elemento corresponde a un valor devuelto codificado en JSON de la función externa.
El tamaño de la matriz debe coincidir con el tamaño de la matriz JSON de |
errorMessage | Mensaje de error cuando se devuelve un código de respuesta HTTP distinto de 200. En el caso de los errores que no se pueden volver a intentar, se devuelve como parte del mensaje de error de la tarea de BigQuery al usuario. | Opcional. Cadena. El tamaño debe ser inferior a 1 KB. |
Ejemplo de respuesta correcta:
{
"replies": [
1,
0
]
}
Ejemplo de una respuesta fallida:
{
"errorMessage": "Received but not expected that the argument 0 be null".
}
Código de respuesta HTTP
Tu endpoint debe devolver el código de respuesta HTTP 200 si la respuesta es correcta. Cuando BigQuery recibe cualquier otro valor, considera que la respuesta es un error y vuelve a intentarlo cuando el código de respuesta HTTP es 408, 429, 500, 503 o 504 hasta alcanzar un límite interno.
Codificación JSON del tipo de datos SQL
La codificación JSON en las solicitudes y respuestas HTTP sigue la codificación JSON de BigQuery de la función TO_JSON_STRING.
Código de función de Cloud Run de ejemplo
El siguiente código de muestra de Python implementa la adición de todos los argumentos enteros de la función remota. Gestiona una solicitud con los argumentos de las invocaciones por lotes y devuelve todos los resultados en una respuesta.
import functions_framework
from flask import jsonify
# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992
@functions_framework.http
def batch_add(request):
try:
return_value = []
request_json = request.get_json()
calls = request_json['calls']
for call in calls:
return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
return_json = jsonify( { "replies": replies } )
return return_json
except Exception as e:
return jsonify( { "errorMessage": str(e) } ), 400
Si la función se implementa en el proyecto my_gcf_project
de la región us-east1
con el nombre remote_add
, se puede acceder a ella a través del endpoint https://us-east1-my_gcf_project.cloudfunctions.net/remote_add
.
Código de ejemplo de Cloud Run
El siguiente código de ejemplo de Python implementa un servicio web que se puede compilar y desplegar en Cloud Run para obtener la misma funcionalidad.
import os
from flask import Flask, request, jsonify
# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992
app = Flask(__name__)
@app.route("/", methods=['POST'])
def batch_add():
try:
return_value = []
request_json = request.get_json()
calls = request_json['calls']
for call in calls:
return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
return jsonify( { "replies" : replies } )
except Exception as e:
return jsonify( { "errorMessage": str(e) } ), 400
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
Consulta la guía sobre cómo crear e implementar el código.
Si el servicio de Cloud Run se despliega en el proyecto my_gcf_project
de la región us-east1
con el nombre de servicio remote_add
, se puede acceder a él a través del endpoint https://remote_add-<project_id_hash>-ue.a.run.app
.
Crear una función remota
BigQuery usa una conexión CLOUD_RESOURCE
para interactuar con tu función de Cloud Run. Para crear una función remota, debes crear una conexión CLOUD_RESOURCE
. Si creas la función remota con DataFrames de BigQuery y tienes el rol de administrador de gestión de identidades y accesos del proyecto (roles/resourcemanager.projectIamAdmin
), no tienes que crear la conexión manualmente ni concederle acceso, ya que el servicio lo hace automáticamente.
Crear una conexión
Debes tener una conexión de recursos de Cloud para conectarte a una función de Cloud Run y a Cloud Run.
Puedes saltarte este paso si tienes una conexión predeterminada configurada o si tienes el rol Administrador de BigQuery.
Crea una conexión de recursos de Cloud para que la use el modelo remoto y obtén la cuenta de servicio de la conexión. Crea la conexión en la misma ubicación que el conjunto de datos que has creado en el paso anterior.
Selecciona una de las opciones siguientes:
Consola
Ve a la página BigQuery.
En el panel Explorador, haga clic en
Añadir datos:Se abrirá el cuadro de diálogo Añadir datos.
En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Aplicaciones empresariales.
También puede introducir
Vertex AI
en el campo Buscar fuentes de datos.En la sección Fuentes de datos destacadas, haga clic en Vertex AI.
Haz clic en la tarjeta de solución Modelos de Vertex AI: federación de BigQuery.
En la lista Tipo de conexión, selecciona Modelos remotos, funciones remotas y BigLake (recurso de Cloud) de Vertex AI.
En el campo ID de conexión, introduce un nombre para la conexión.
Haga clic en Crear conexión.
Haz clic en Ir a la conexión.
En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.
bq
En un entorno de línea de comandos, crea una conexión:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
El parámetro
--project_id
anula el proyecto predeterminado.Haz los cambios siguientes:
REGION
: tu región de conexiónPROJECT_ID
: tu ID de proyecto Google CloudCONNECTION_ID
: un ID para tu conexión
Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia a la conexión.
Solución de problemas: si aparece el siguiente error de conexión, actualiza el SDK de Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Obtén y copia el ID de la cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
El resultado debería ser similar al siguiente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Usa el recurso google_bigquery_connection
.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar la autenticación para bibliotecas de cliente.
En el siguiente ejemplo se crea una conexión de recursos de Cloud llamada my_cloud_resource_connection
en la región US
:
Para aplicar la configuración de Terraform en un proyecto, sigue los pasos que se indican en las siguientes secciones. Google Cloud
Preparar Cloud Shell
- Abre Cloud Shell.
-
Define el Google Cloud proyecto Google Cloud predeterminado en el que quieras aplicar tus configuraciones de Terraform.
Solo tiene que ejecutar este comando una vez por proyecto y puede hacerlo en cualquier directorio.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.
Preparar el directorio
Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).
-
En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión
.tf
. Por ejemplo,main.tf
. En este tutorial, nos referiremos al archivo comomain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.
Copia el código de ejemplo en el archivo
main.tf
que acabas de crear.También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.
- Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
- Guarda los cambios.
-
Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
terraform init
Si quieres usar la versión más reciente del proveedor de Google, incluye la opción
-upgrade
:terraform init -upgrade
Aplica los cambios
-
Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
terraform plan
Haga las correcciones necesarias en la configuración.
-
Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo
yes
en la petición:terraform apply
Espera hasta que Terraform muestre el mensaje "Apply complete!".
- Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para asegurarte de que Terraform los ha creado o actualizado.
Configurar el acceso
Debes dar a la nueva conexión acceso de solo lectura a tu función o servicio de Cloud Run. No se recomienda permitir la invocación sin autenticar de tu función o servicio de Cloud Run.
Para asignar roles, sigue estos pasos:
Ve a la página IAM y administración.
Haz clic en
Añadir.Se abrirá el cuadro de diálogo Añadir principales.
En el campo Nuevos principales, introduce el ID de la cuenta de servicio que has copiado anteriormente.
En el campo Selecciona un rol, elige una de las siguientes opciones:
- Si usas una función de Cloud Run de primera generación, elige Función de Cloud y, a continuación, selecciona el rol Invocador de función de Cloud.
- Si usas una función de Cloud Run de segunda generación, elige Cloud Run y, a continuación, selecciona Rol Invocador de Cloud Run.
- Si usas un servicio de Cloud Run, elige Cloud Run y, a continuación, selecciona Rol Invocador de Cloud Run.
Haz clic en Guardar.
Crear una función remota
Para crear una función remota, sigue estos pasos:
SQL
Ejecuta la siguiente instrucción CREATE FUNCTION
en BigQuery:
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, introduce la siguiente instrucción:
CREATE FUNCTION
PROJECT_ID.DATASET_ID
.remote_add(x INT64, y INT64) RETURNS INT64 REMOTE WITH CONNECTIONPROJECT_ID.LOCATION.CONNECTION_NAME
OPTIONS ( endpoint = 'ENDPOINT_URL' )Haz los cambios siguientes:
DATASET_ID
: el ID de tu conjunto de datos de BigQuery.ENDPOINT_URL
: la URL de tu función de Cloud Run o del endpoint de la función remota de Cloud Run.
Haz clic en
Ejecutar.
Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.
BigQuery DataFrames
- Habilita las APIs necesarias y asegúrate de que se te han concedido los roles obligatorios, tal como se describe en la sección Requisitos de Funciones remotas.
Usa el decorador
remote_function
:import bigframes.pandas as bpd # Set BigQuery DataFrames options bpd.options.bigquery.project = your_gcp_project_id bpd.options.bigquery.location = "US" # BigQuery DataFrames gives you the ability to turn your custom scalar # functions into a BigQuery remote function. It requires the GCP project to # be set up appropriately and the user having sufficient privileges to use # them. One can find more details about the usage and the requirements via # `help` command. help(bpd.remote_function) # Read a table and inspect the column of interest. df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins") df["body_mass_g"].head(10) # Define a custom function, and specify the intent to turn it into a remote # function. It requires a BigQuery connection. If the connection is not # already created, BigQuery DataFrames will attempt to create one assuming # the necessary APIs and IAM permissions are setup in the project. In our # examples we will be letting the default connection `bigframes-default-connection` # be used. We will also set `reuse=False` to make sure we don't # step over someone else creating remote function in the same project from # the exact same source code at the same time. Let's try a `pandas`-like use # case in which we want to apply a user defined scalar function to every # value in a `Series`, more specifically bucketize the `body_mass_g` value # of the penguins, which is a real number, into a category, which is a # string. @bpd.remote_function( reuse=False, cloud_function_service_account="default", ) def get_bucket(num: float) -> str: if not num: return "NA" boundary = 4000 return "at_or_above_4000" if num >= boundary else "below_4000" # Then we can apply the remote function on the `Series` of interest via # `apply` API and store the result in a new column in the DataFrame. df = df.assign(body_mass_bucket=df["body_mass_g"].apply(get_bucket)) # This will add a new column `body_mass_bucket` in the DataFrame. You can # preview the original value and the bucketized value side by side. df[["body_mass_g", "body_mass_bucket"]].head(10) # The above operation was possible by doing all the computation on the # cloud. For that, there is a google cloud function deployed by serializing # the user code, and a BigQuery remote function created to call the cloud # function via the latter's http endpoint on the data in the DataFrame. # The BigQuery remote function created to support the BigQuery DataFrames # remote function can be located via a property `bigframes_remote_function` # set in the remote function object. print(f"Created BQ remote function: {get_bucket.bigframes_remote_function}") # The cloud function can be located via another property # `bigframes_cloud_function` set in the remote function object. print(f"Created cloud function: {get_bucket.bigframes_cloud_function}") # Warning: The deployed cloud function may be visible to other users with # sufficient privilege in the project, so the user should be careful about # having any sensitive data in the code that will be deployed as a remote # function. # Let's continue trying other potential use cases of remote functions. Let's # say we consider the `species`, `island` and `sex` of the penguins # sensitive information and want to redact that by replacing with their hash # code instead. Let's define another scalar custom function and decorate it # as a remote function. The custom function in this example has external # package dependency, which can be specified via `packages` parameter. @bpd.remote_function( reuse=False, packages=["cryptography"], cloud_function_service_account="default", ) def get_hash(input: str) -> str: from cryptography.fernet import Fernet # handle missing value if input is None: input = "" key = Fernet.generate_key() f = Fernet(key) return f.encrypt(input.encode()).decode() # We can use this remote function in another `pandas`-like API `map` that # can be applied on a DataFrame df_redacted = df[["species", "island", "sex"]].map(get_hash) df_redacted.head(10)
Debe tener el permiso bigquery.routines.create
en el conjunto de datos en el que cree la función remota y el permiso bigquery.connections.delegate
(disponible en el rol Administrador de conexiones de BigQuery) en la conexión que use la función remota.
Proporcionar contexto definido por el usuario
Puedes especificar user_defined_context
en OPTIONS
como un tipo de pares clave-valor, que formarán parte de cada solicitud HTTP al endpoint. Con el contexto definido por el usuario, puedes crear varias funciones remotas, pero reutilizar un solo endpoint, que proporciona diferentes comportamientos en función del contexto que se le haya pasado.
En los siguientes ejemplos se crean dos funciones remotas para encriptar y desencriptar datos de BYTES
con el mismo endpoint.
CREATE FUNCTION `PROJECT_ID.DATASET_ID`.encrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
endpoint = 'ENDPOINT_URL',
user_defined_context = [("mode", "encryption")]
)
CREATE FUNCTION `PROJECT_ID.DATASET_ID`.decrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
endpoint = 'ENDPOINT_URL',
user_defined_context = [("mode", "decryption")]
)
Limitar el número de filas en una solicitud en lote
Puedes especificar max_batching_rows
en OPTIONS
como el número máximo de filas de cada solicitud HTTP para evitar que se agote el tiempo de espera de las funciones de Cloud Run. Si especificas max_batching_rows
, BigQuery determina el número de filas de un lote hasta el límite de max_batching_rows
. Si no se especifica, BigQuery determina automáticamente el número de filas que se van a agrupar.
Usar una función remota en una consulta
Asegúrate de haber concedido el permiso en tu función de Cloud Run para que la cuenta de servicio de BigQuery asociada a la conexión de la función remota pueda acceder a ella.
También debe tener el permiso bigquery.routines.get
en el conjunto de datos donde se encuentra la función remota y el permiso bigquery.connections.use
, que puede obtener a través del rol BigQuery Connection User
, en la conexión que utiliza la función remota.
Puedes usar una función remota en una consulta igual que una función definida por el usuario.
Por ejemplo, puedes usar la función remote_add
en la consulta de ejemplo:
SELECT
val,
`PROJECT_ID.DATASET_ID`.remote_add(val, 2)
FROM
UNNEST([NULL,2,3,5,8]) AS val;
Este ejemplo genera el siguiente resultado:
+------+-----+
| val | f0_ |
+------+-----+
| NULL | 2 |
| 2 | 4 |
| 3 | 5 |
| 5 | 7 |
| 8 | 10 |
+------+-----+
Regiones disponibles
Hay dos tipos de ubicaciones en BigQuery:
Una región es un lugar geográfico específico, como Londres.
Una multirregión es una zona geográfica amplia, como Estados Unidos, que contiene dos o más ubicaciones geográficas.
Una sola región
En un conjunto de datos de una sola región de BigQuery, solo puede crear una función remota que use una función de Cloud Run implementada en la misma región. Por ejemplo:
- Una función remota de una sola región de BigQuery
us-east4
solo puede usar una función de Cloud Run enus-east4
.
Por lo tanto, en el caso de las regiones únicas, las funciones remotas solo se admiten en las regiones que admiten tanto funciones de Cloud Run como BigQuery.
Multirregional
En un conjunto de datos multirregional de BigQuery (US
, EU
), solo puedes crear una función remota que use una función de Cloud Run implementada en una región que se encuentre en la misma zona geográfica grande (EE. UU. o UE). Por ejemplo:
- Una función remota de la multirregión
US
de BigQuery solo puede usar una función de Cloud Run implementada en cualquier región de la zona geográfica de EE. UU., comous-central1
,us-east4
ous-west2
, entre otras. - Una función remota de la
EU
multirregión de BigQuery solo puede usar una función de Cloud Run implementada en cualquier región de los Estados miembros de la Unión Europea, comoeurope-north1
,europe-west3
, etc.
Para obtener más información sobre las regiones y las multirregiones de BigQuery, consulta la página Ubicaciones de conjuntos de datos. Para obtener más información sobre las regiones de las funciones de Cloud Run, consulta la página Ubicaciones de las funciones de Cloud Run.
Conexiones
Tanto en las ubicaciones de una sola región como en las multirregionales, solo puedes crear una función remota en la misma ubicación que la conexión que utilices. Por ejemplo, para crear una función remota en la multirregión US
, usa una conexión ubicada en la multirregión US
.
Precios
Se aplican los precios estándar de BigQuery.
Además, es posible que se apliquen cargos por las funciones de Cloud Run y por Cloud Run al usar esta función. Consulta las páginas de precios de Cloud Functions y Cloud Run para obtener más información.
Usar Controles de Servicio de VPC
Controles de Servicio de VPC es una Google Cloud función que te permite configurar un perímetro seguro para protegerte frente a la filtración externa de datos. Para usar Controles de Servicio de VPC con funciones remotas para aumentar la seguridad o para usar endpoints con internal traffic
ajustes de entrada,
sigue la guía de Controles de Servicio de VPC para hacer lo siguiente:
Crea un perímetro de servicio.
Añade al perímetro el proyecto de BigQuery de la consulta que usa la función remota.
Añade el proyecto del endpoint al perímetro y define
Cloud Functions API
oCloud Run API
en los servicios restringidos en función del tipo de endpoint. Para obtener más información, consulta Controles de Servicio de VPC de funciones de Cloud Run y Controles de Servicio de VPC de Cloud Run.
Prácticas recomendadas para funciones remotas
Prefiltra la entrada: si puedes filtrar fácilmente la entrada antes de pasarla a una función remota, es probable que tu consulta sea más rápida y barata.
Mantén la escalabilidad de tu función de Cloud Run. La escalabilidad depende de las instancias mínimas, las instancias máximas y la simultaneidad.
- Siempre que sea posible, usa el valor predeterminado para el número máximo de instancias de tu función de Cloud Run.
- Ten en cuenta que no hay ningún límite predeterminado para las funciones HTTP de Cloud Run de 1.ª gen. Para evitar eventos de escalado ilimitados con funciones HTTP de Cloud Run de 1.ª gen. durante las pruebas o en producción, te recomendamos que establezcas un límite, por ejemplo, 3000.
Sigue otros consejos sobre funciones de Cloud Run para mejorar el rendimiento. Las consultas de funciones remotas que interactúan con una función de Cloud Run con una latencia alta pueden fallar debido al tiempo de espera.
Implementa tu endpoint para que devuelva el código de respuesta HTTP y la carga útil correctos en caso de que la respuesta falle.
Para minimizar los reintentos de BigQuery, usa códigos de respuesta HTTP distintos de 408, 429, 500, 503 y 504 para una respuesta fallida, y asegúrate de detectar todas las excepciones en el código de tu función. De lo contrario, el marco de servicio HTTP puede devolver automáticamente el código 500 en caso de excepciones no controladas. Es posible que sigas viendo solicitudes HTTP reintentadas cuando BigQuery reintente una partición de datos o una consulta fallida.
Tu endpoint debe devolver una carga útil JSON con el formato definido para una respuesta fallida. Aunque no es estrictamente necesario, ayuda a BigQuery a distinguir si la respuesta fallida procede de la implementación de tu función o de la infraestructura de Cloud Run functions o Cloud Run. En este último caso, BigQuery puede volver a intentarlo con un límite interno diferente.
Cuotas
Para obtener información sobre las cuotas de funciones remotas, consulta Cuotas y límites.