Tablestore es un servicio de almacenamiento de datos NoSQL distribuido basado en el sistema Apsara. Un disparador de Tablestore conecta Tablestore como origen de eventos para Function Compute. Cuando los datos cambian en una tabla de Tablestore, el disparador invoca automáticamente su función para procesar los datos incrementales, sin necesidad de sondeos.
Caso de uso típico: un origen de datos escribe en la Tabla A. Esta actualización activa una función que limpia los datos y escribe los resultados en la Tabla B, listos para lectura directa. Todo el pipeline se ejecuta como una aplicación serverless elástica y escalable.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una función en Function Compute. Consulte Create a function.
Una instancia de Tablestore. Consulte Create instances.
Una tabla en dicha instancia. Consulte Create tables.
Limitaciones
Los disparadores de Tablestore son compatibles con las siguientes regiones: China (Beijing), China (Hangzhou), China (Shanghai), China (Shenzhen), Japan (Tokyo), Singapore, Germany (Frankfurt) y China (Hong Kong).
La tabla de Tablestore debe residir en la misma región que la función.
La ejecución de la función invocada por un disparador de Tablestore no puede superar 1 minuto.
Para acceder a Tablestore mediante una red interna, utilice un endpoint de Virtual Private Cloud (VPC) con el formato:
{instance}.{region}.vpc.tablestore.aliyuncs.com.
Notas de uso
Evite los bucles de invocación. Si una función escribe de vuelta en la misma tabla que la activó —por ejemplo, la Tabla A activa la Función B y esta actualiza la Tabla A—, el disparador se vuelve a ejecutar y genera un bucle infinito. Diseñe el flujo de datos de modo que la salida de la función se dirija a una tabla distinta.
Comportamiento de reintento ante errores. Si falla la ejecución de una función, el disparador reintenta hasta que los datos de registro de Tablestore caducan.
Un error de ejecución de función ocurre en alguna de estas situaciones:
Se inicia una instancia de función, pero el código no se ejecuta como se esperaba. En este caso, se cobran tarifas por la instancia.
Una instancia de función no logra iniciarse (por ejemplo, debido a un error en el comando de inicio). En este caso, no se cobran tarifas.
Para detener los reintentos infinitos, deshabilite la función Stream de la tabla de datos. Antes de deshabilitar Stream, confirme que ningún otro disparador esté utilizando la misma tabla.
Paso 1: Habilite la función Stream de la tabla de datos
La función Stream de Tablestore captura los cambios incrementales de datos y los entrega a su función. Habilítela en la tabla de datos antes de crear el disparador.
Inicie sesión en la consola de Tablestore.
En la barra de navegación superior, seleccione una región.
En la página Overview, haga clic en el alias de la instancia o haga clic en Manage Instance en la columna Actions.
En la pestaña Instance Details, haga clic en la pestaña Data Tables. Luego, haga clic en el nombre de la tabla y seleccione la pestaña Stream, o bien haga clic en
y seleccione Stream.En la pestaña Stream, haga clic en Enable junto a Stream Information.
En el cuadro de diálogo Enable Stream, establezca el parámetro Log Expiration Time y haga clic en Enable. El valor debe ser un número entero distinto de cero, expresado en horas. Máximo: 168 horas.
El tiempo de caducidad del registro no se puede modificar después de configurarlo. Elija el valor con cuidado.
Paso 2: Cree un disparador de Tablestore
Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, haga clic en Functions.
En la barra de navegación superior, seleccione una región. En la página Functions, haga clic en la función que desea configurar.
En la página de detalles de la función, haga clic en la pestaña Configurations. En el panel de navegación izquierdo, haga clic en Triggers y luego en Create Trigger.
En el panel Create Trigger, configure los siguientes parámetros y haga clic en OK.
|
Parámetro |
Descripción |
Ejemplo |
|
Trigger type |
Tipo de disparador. Seleccione Tablestore. |
Tablestore |
|
Name |
Nombre del disparador. |
Tablestore-trigger |
|
Version or alias |
Versión o alias de la función que se va a vincular. Valor predeterminado: LATEST. Para vincular otra versión o alias, selecciónelo en la lista desplegable Version or Alias de la página de detalles de la función. Consulte Manage versions y Manage aliases. |
LATEST |
|
Instance |
Nombre de la instancia de Tablestore existente. |
d00dd8xm\\\\ |
|
Table |
Nombre de la tabla existente. |
mytable |
|
Role name |
Rol de RAM que otorga a Function Compute el permiso para leer desde el Stream de Tablestore. Seleccione AliyunTableStoreStreamNotificationRole. |
AliyunTableStoreStreamNotificationRole |
Si es la primera vez que crea un disparador de este tipo, haga clic en Authorize Now en el cuadro de diálogo que aparece.
Una vez creado el disparador, este aparece en la pestaña Triggers. Para modificar o eliminar un disparador, consulte Gestión de disparadores.
Paso 3: Configure los parámetros de prueba
Para probar la función antes de que lleguen datos de Tablestore, configure un evento de prueba que coincida con el formato de carga útil del disparador de Tablestore.
En la pestaña Code de la página de detalles de la función, haga clic en el icono
junto a Test Function y seleccione Configure Test Parameters.En el panel Configure Test Parameters, haga clic en Create New Test Event o en Modify Existing Test Event, introduzca un nombre de evento y su contenido, y luego haga clic en OK.
El disparador de Tablestore codifica los datos incrementales en formato Concise Binary Object Representation (CBOR) y los pasa a su función como un evento. A continuación se muestra una carga útil con tres tipos de registros —PutRow, UpdateRow y DeleteRow— para que observe cómo varía la estructura según la operación:
{
"Version": "Sync-v1",
"Records": [
{
"Type": "PutRow",
"Info": {
"Timestamp": 1506416585740836
},
"PrimaryKey": [
{
"ColumnName": "pk_0",
"Value": 1506416585881590900
},
{
"ColumnName": "pk_1",
"Value": "2017-09-26 17:03:05.8815909 +0800 CST"
},
{
"ColumnName": "pk_2",
"Value": 1506416585741000
}
],
"Columns": [
{
"Type": "Put",
"ColumnName": "attr_0",
"Value": "hello_table_store",
"Timestamp": 1506416585741
},
{
"Type": "Put",
"ColumnName": "attr_1",
"Value": 1506416585881590900,
"Timestamp": 1506416585741
}
]
},
{
"Type": "UpdateRow",
"Info": {
"Timestamp": 1506416600000000
},
"PrimaryKey": [
{
"ColumnName": "pk_0",
"Value": 1506416585881590900
}
],
"Columns": [
{
"Type": "Put",
"ColumnName": "attr_0",
"Value": "updated_value",
"Timestamp": 1506416600000
},
{
"Type": "DeleteOneVersion",
"ColumnName": "attr_1",
"Timestamp": 1506416585741
}
]
},
{
"Type": "DeleteRow",
"Info": {
"Timestamp": 1506416700000000
},
"PrimaryKey": [
{
"ColumnName": "pk_0",
"Value": 1506416585881590900
}
],
"Columns": []
}
]
}
A continuación se describen los campos del evento.
|
Campo |
Descripción |
|
|
Versión de la carga útil. Valor: |
|
|
Arreglo de filas de datos incrementales. Cada elemento contiene |
|
|
Tipo de operación de la fila. Valores válidos: |
|
|
Metadatos de la fila. Contiene |
|
|
Arreglo de columnas de clave primaria. Cada elemento contiene |
|
|
Arreglo de columnas de atributos. Cada elemento contiene: |
Paso 4: Escriba y pruebe el código de la función
Después de crear el disparador, escriba el código de la función para procesar la carga útil del evento de Tablestore. La función se invoca automáticamente cuando cambian los datos de la tabla.
-
En la página de detalles de la función, haga clic en la pestaña Code, introduzca el código de la función y haga clic en Deploy. El siguiente ejemplo en Python lee los registros de eventos de Tablestore y extrae los valores de la clave primaria y de las columnas de atributos:
import logging import cbor import json def get_attribute_value(record, column): attrs = record[u'Columns'] for x in attrs: if x[u'ColumnName'] == column: return x['Value'] def get_pk_value(record, column): attrs = record[u'PrimaryKey'] for x in attrs: if x['ColumnName'] == column: return x['Value'] def handler(event, context): logger = logging.getLogger() logger.info("Begin to handle event") #records = cbor.loads(event) records = json.loads(event) for record in records['Records']: logger.info("Handle record: %s", record) pk_0 = get_pk_value(record, "pk_0") attr_0 = get_attribute_value(record, "attr_0") return 'OK' Haga clic en Test Function.
Una vez finalizada la ejecución, consulte los resultados en la pestaña Code.
Preguntas frecuentes
¿Por qué falla la creación del disparador en una región específica?
Los disparadores de Tablestore solo están disponibles en ciertas regiones. Revise la sección Limitations para confirmar que su región sea compatible.
¿Por qué no encuentro mi tabla de Tablestore al crear un disparador?
La tabla de Tablestore debe residir en la misma región que la función. Si la tabla está en otra región, no aparecerá en la configuración del disparador.
¿Por qué sigo viendo errores de "Invocation canceled by client"?
Este error suele indicar que el tiempo de espera del cliente es más corto que la duración real de la ejecución de la función. Aumente el periodo de tiempo de espera del cliente. Para obtener más información, consulte What do I do if the client is disconnected and the message "Invocation canceled by client" is reported?
¿Por qué mi disparador de Tablestore no se activa después de escribir datos en la tabla?
Compruebe lo siguiente:
Confirme que la función Stream esté habilitada para la tabla. Consulte Step 1: Enable the Stream feature for the data table.
Confirme que se haya configurado el rol correcto (
AliyunTableStoreStreamNotificationRole) al crear el disparador. Consulte Step 2: Create a Tablestore trigger.Revise los registros de ejecución de la función para comprobar si hay fallos. Si la función falla de manera repetida, reintenta hasta que los datos de registro caducan. Consulte What do I do if a trigger cannot trigger function execution?