Tablestore est un service de stockage de données NoSQL distribué, bâti sur le système Apsara. Un déclencheur Tablestore configure Tablestore comme source d'événements pour Function Compute. Lorsqu'une table Tablestore subit des modifications, le déclencheur appelle automatiquement votre fonction pour traiter les données incrémentielles, sans nécessiter de sondage.
Cas d'utilisation typique : une source de données écrit dans la table A. La mise à jour déclenche une fonction qui nettoie les données et écrit les résultats dans la table B, prêts pour une lecture directe. L'ensemble du pipeline s'exécute sous forme d'une application serverless élastique et évolutive.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Une fonction dans Function Compute. Consultez la rubrique Créer une fonction.
Une instance Tablestore. Consultez la rubrique Créer des instances.
Une table dans cette instance. Consultez la rubrique Créer des tables.
Limites
Les déclencheurs Tablestore sont pris en charge dans les régions suivantes : Chine (Pékin), Chine (Hangzhou), Chine (Shanghai), Chine (Shenzhen), Japon (Tokyo), Singapour, Allemagne (Francfort) et Chine (Hong Kong).
La table Tablestore doit se trouver dans la même région que la fonction.
L'exécution d'une fonction invoquée par un déclencheur Tablestore ne peut pas dépasser 1 minute.
Pour accéder à Tablestore via un réseau interne, utilisez un endpoint VPC au format suivant :
{instance}.{region}.vpc.tablestore.aliyuncs.com.
Notes d'utilisation
Évitez les boucles d'appel. Si une fonction réécrit dans la même table qui l'a déclenchée — par exemple, la table A déclenche la fonction B, et la fonction B met à jour la table A — le déclencheur se réactive, créant ainsi une boucle infinie. Concevez votre flux de données de manière à ce que la sortie de la fonction soit dirigée vers une table différente.
Comportement de nouvelle tentative en cas d'échec. Si l'exécution d'une fonction échoue, le déclencheur effectue des nouvelles tentatives jusqu'à l'expiration des données de journal dans Tablestore.
Un échec d'exécution de fonction se produit dans l'une des situations suivantes :
Une instance de fonction démarre, mais le code ne s'exécute pas comme prévu. Dans ce cas, des frais sont facturés pour l'instance.
Le démarrage d'une instance de fonction échoue (par exemple, en raison d'une erreur dans la commande de démarrage). Dans ce cas, aucun frais n'est facturé.
Pour arrêter les nouvelles tentatives infinies, désactivez la fonctionnalité Stream pour la table de données. Avant de désactiver Stream, confirmez qu'aucun autre déclencheur n'utilise la même table.
Étape 1 : Activer la fonctionnalité Stream pour la table de données
La fonctionnalité Stream de Tablestore capture les modifications incrémentielles des données et les transmet à votre fonction. Activez-la sur la table de données avant de créer le déclencheur.
Connectez-vous à la console Tablestore.
Dans la barre de navigation supérieure, sélectionnez une région.
Sur la page Overview, cliquez sur l'alias de l'instance ou cliquez sur Manage Instance dans la colonne Actions.
Sous l'onglet Instance Details , cliquez sur l'onglet Data Tables . Cliquez ensuite sur le nom de la table et sélectionnez l'onglet Stream , ou cliquez sur
et sélectionnez Stream.Sous l'onglet Stream , cliquez sur Enable à côté des informations Stream.
Dans la boîte de dialogue Enable Stream , définissez le paramètre Log Expiration Time et cliquez sur Enable . La valeur doit être un entier non nul exprimé en heures. Maximum : 168 heures.
Le temps d'expiration des journaux ne peut pas être modifié après sa définition. Choisissez avec soin.
Étape 2 : Créer un déclencheur Tablestore
Connectez-vous à la console Function Compute . Dans le volet de navigation de gauche, cliquez sur Functions .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions , cliquez sur la fonction que vous souhaitez configurer.
Sur la page des détails de la fonction, cliquez sur l'onglet Configurations . Dans le volet de navigation de gauche, cliquez sur Triggers , puis cliquez sur Create Trigger .
Dans le panneau Create Trigger , configurez les paramètres suivants et cliquez sur OK .
| Paramètre | Description | Exemple |
|---|---|---|
| Trigger type | Le type de déclencheur. Sélectionnez Tablestore . | Tablestore |
| Name | Le nom du déclencheur. | Tablestore-trigger |
| Version or alias | La version ou l'alias de la fonction à lier. Par défaut : LATEST . Pour lier une version ou un alias différent, sélectionnez-le dans la liste déroulante Version or Alias sur la page des détails de la fonction. Consultez les rubriques Gérer les versions et Gérer les alias . | LATEST |
| Instance | Le nom de l'instance Tablestore existante. | d00dd8xm\\\\ |
| Table | Le nom de la table existante. | mytable |
| Role name | Le rôle RAM qui accorde à Function Compute l'autorisation de lire depuis le Stream Tablestore. Sélectionnez AliyunTableStoreStreamNotificationRole . | AliyunTableStoreStreamNotificationRole |
Si c'est la première fois que vous créez un déclencheur de ce type, cliquez sur Authorize Now dans la boîte de dialogue qui s'affiche.
Une fois le déclencheur créé, il apparaît sous l'onglet Triggers . Pour modifier ou supprimer un déclencheur, consultez la rubrique Gestion des déclencheurs .
Étape 3 : Configurer les paramètres de test
Pour tester la fonction avant l'arrivée des données depuis Tablestore, configurez un événement de test correspondant au format de charge utile du déclencheur Tablestore.
Sous l'onglet Code de la page des détails de la fonction, cliquez sur l'icône
à côté de Test Function et sélectionnez Configure Test Parameters .Dans le panneau Configure Test Parameters , cliquez sur Create New Test Event ou Modify Existing Test Event , saisissez un nom d'événement et le contenu de l'événement, puis cliquez sur OK .
Le déclencheur Tablestore encode les données incrémentielles au format Concise Binary Object Representation (CBOR) et les transmet à votre fonction sous forme d'événement. L'exemple suivant montre une charge utile avec trois types d'enregistrements — PutRow , UpdateRow et DeleteRow — afin que vous puissiez voir comment la structure varie selon l'opération :
{
"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": []
}
]
}
Le tableau suivant décrit les champs de l'événement.
| Champ | Description |
|---|---|
Version |
La version de la charge utile. Valeur : Sync-v1 (chaîne). |
Records |
Un tableau de lignes de données incrémentielles. Chaque élément contient Type , Info , PrimaryKey et Columns . |
Type (ligne) |
Le type d'opération pour la ligne. Valeurs valides : PutRow , UpdateRow , DeleteRow (chaîne). |
Info |
Métadonnées de la ligne. Contient Timestamp : l'heure UTC de la dernière modification de la ligne (INT64). |
PrimaryKey |
Un tableau de colonnes de clé primaire. Chaque élément contient ColumnName (chaîne) et Value (INTEGER, STRING ou BLOB). |
Columns |
Un tableau de colonnes d'attributs. Chaque élément contient : Type (opération sur la colonne : Put , DeleteOneVersion ou DeleteAllVersions ), ColumnName (chaîne), Value (INTEGER, BOOLEAN, DOUBLE, STRING ou BLOB) et Timestamp (heure UTC de la dernière modification, INT64). |
Étape 4 : Écrire et tester le code de la fonction
Après la création du déclencheur, écrivez le code de votre fonction pour traiter la charge utile de l'événement Tablestore. La fonction est appelée automatiquement lorsque les données de la table changent.
-
Sur la page des détails de la fonction, cliquez sur l'onglet Code , saisissez le code de votre fonction et cliquez sur Deploy . L'exemple Python suivant lit les enregistrements d'événements Tablestore et extrait les valeurs des clés primaires et des colonnes d'attributs :
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' Cliquez sur Test Function .
Après l'exécution, consultez les résultats sous l'onglet Code .
FAQ
Pourquoi la création du déclencheur échoue-t-elle dans une région spécifique ?
Les déclencheurs Tablestore sont disponibles uniquement dans certaines régions. Vérifiez la section Limites pour confirmer que votre région est prise en charge.
Pourquoi ne puis-je pas trouver ma table Tablestore lors de la création d'un déclencheur ?
La table Tablestore doit se trouver dans la même région que la fonction. Si la table se trouve dans une région différente, elle n'apparaîtra pas dans la configuration du déclencheur.
Pourquoi vois-je constamment des erreurs « Invocation canceled by client » ?
Cette erreur signifie généralement que le délai d'attente côté client est plus court que la durée réelle d'exécution de la fonction. Augmentez la période de délai d'attente du client. Pour plus de détails, consultez la rubrique Que faire si le client est déconnecté et que le message « Invocation canceled by client » est signalé ?
Pourquoi mon déclencheur Tablestore ne se déclenche-t-il pas après l'écriture de données dans la table ?
Vérifiez les points suivants :
Confirmez que la fonctionnalité Stream est activée pour la table. Consultez la rubrique Étape 1 : Activer la fonctionnalité Stream pour la table de données .
Confirmez que le rôle correct (
AliyunTableStoreStreamNotificationRole) a été configuré lors de la création du déclencheur. Consultez la rubrique Étape 2 : Créer un déclencheur Tablestore .Vérifiez les journaux d'exécution de la fonction pour voir si l'exécution échoue. Si la fonction échoue de manière répétée, elle effectue des nouvelles tentatives jusqu'à l'expiration des données de journal. Consultez la rubrique Que faire si un déclencheur ne parvient pas à déclencher l'exécution de la fonction ?