O Tablestore é um service de armazenamento de dados NoSQL distribuído desenvolvido sobre o sistema Apsara. Um trigger do Tablestore conecta o Tablestore como uma source de eventos para o Function Compute. Quando os dados de uma tabela do Tablestore são alterados, o trigger invoca automaticamente sua função para processar os dados incrementais, sem necessidade de polling.
Caso de uso típico: uma source de dados grava na Tabela A. A atualização aciona uma função que limpa os dados e grava os resultados na Tabela B, prontos para leitura direta. Todo o pipeline execute como uma aplicação serverless elástica e escalável.
Pré-requisitos
Antes de começar, verifique se você possui:
Uma função no Function Compute. Consulte Create a function.
Uma instância do Tablestore. Consulte Create instances.
Uma tabela nessa instância. Consulte Create tables.
Limitações
Os triggers do Tablestore têm suporte nas seguintes regiões: China (Beijing), China (Hangzhou), China (Shanghai), China (Shenzhen), Japan (Tokyo), Singapore, Germany (Frankfurt) e China (Hong Kong).
A tabela do Tablestore deve residir na mesma região da função.
A execução da função invocada por um trigger do Tablestore não pode exceder 1 minuto.
Para acessar o Tablestore pela rede interna, use um endpoint de Virtual Private Cloud (VPC) no formato:
{instance}.{region}.vpc.tablestore.aliyuncs.com.
Observações de uso
Evite loops de invocação. Se uma função gravar de volta na mesma tabela que a acionou — por exemplo, a Tabela A aciona a Função B e a Função B atualize a Tabela A — o trigger dispara novamente e cria um loop infinito. Projete seu fluxo de dados para direcionar a saída da função a uma tabela diferente.
Comportamento de nova tentativa em caso de falha. Se a execução da função falhar, o trigger tentará novamente até que os dados de log no Tablestore expirem.
A falha na execução da função ocorre em uma destas situações:
Uma instância da função inicia, mas o código não execute conforme o esperado. Nesse caso, há cobrança de taxas pela instância.
Uma instância da função falha ao iniciar (por exemplo, devido a um erro no comando de inicialização). Nesse caso, não há cobrança de taxas.
Para interromper novas tentativas infinitas, desative o recurso Stream na tabela de dados. Antes de desativar o Stream, confirme que nenhum outro trigger utiliza a mesma tabela.
Etapa 1: Ativar o recurso Stream na tabela de dados
O recurso Stream do Tablestore captura alterações incrementais nos dados e as entrega à sua função. Ative-o na tabela de dados antes de crie o trigger.
Faça login no console do Tablestore.
Na barra de navegação superior, selecione uma região.
Na página Overview, clique em no alias da instância ou em Manage Instance na coluna Actions.
Na aba Instance Details, clique em na aba Data Tables. Em seguida, clique em no nome da tabela e selecione a aba Stream, ou clique em em
e selecione Stream.Na aba Stream, clique em em Enable ao lado de Stream Information.
Na caixa de diálogo Enable Stream, defina o parâmetro Log Expiration Time e clique em em Enable. O valor deve ser um número inteiro diferente de zero, em horas. Máximo: 168 horas.
Não é possível modifique o Log Expiration Time após a definição. Escolha com cuidado.
Etapa 2: Crie um trigger do Tablestore
Faça login no console do Function Compute. No painel de navegação à esquerda, clique em em Functions.
Na barra de navegação superior, selecione uma região. Na página Functions, clique em na função desejada.
Na página de detalhes da função, clique em na aba Configurations. No painel de navegação à esquerda, clique em em Triggers e, em seguida, em Create Trigger.
No painel Create Trigger, configure os seguintes parâmetros e clique em em OK.
|
Parâmetro |
Descrição |
Exemplo |
|
Trigger type |
Tipo do trigger. Selecione Tablestore. |
Tablestore |
|
Name |
Nome do trigger. |
Tablestore-trigger |
|
Version or alias |
Versão ou alias da função a vincular. Padrão: LATEST. Para vincular uma versão ou alias diferente, selecione-o na lista suspensa Version or Alias na página de detalhes da função. Consulte Manage versions e Manage aliases. |
LATEST |
|
Instance |
Nome da instância existente do Tablestore. |
d00dd8xm\\\\ |
|
Table |
Nome da tabela existente. |
mytable |
|
Role name |
Função do RAM que concede permissão ao Function Compute para ler o Stream do Tablestore. Selecione AliyunTableStoreStreamNotificationRole. |
AliyunTableStoreStreamNotificationRole |
Se esta for a primeira vez que você crie um trigger deste tipo, clique em em Authorize Now na caixa de diálogo exibida.
Após a criação, o trigger aparece na aba Triggers. Para modifique ou exclua um trigger, consulte Gerenciamento de triggers.
Etapa 3: Configure parâmetros de teste
Para testar a função antes da chegada dos dados do Tablestore, configure um evento de teste compatível com o formato de payload do trigger do Tablestore.
Na aba Code da página de detalhes da função, clique em no ícone
ao lado de Test Function e selecione Configure Test Parameters.No painel Configure Test Parameters, clique em em Create New Test Event ou Modify Existing Test Event, insira o nome e o conteúdo do evento e clique em em OK.
O trigger do Tablestore codifica dados incrementais no formato Concise Binary Object Representation (CBOR) e os passa para sua função como um evento. O exemplo a seguir mostra um payload com três tipos de registro — PutRow, UpdateRow e DeleteRow — para demonstrar como a estrutura varia conforme a operação:
{
"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 tabela a seguir descreve os campos do evento.
|
Campo |
Descrição |
|
|
Versão do payload. Valor: |
|
|
Array de linhas de dados incrementais. Cada elemento contém |
|
|
Tipo de operação da linha. Valores válidos: |
|
|
Metadados da linha. Contém |
|
|
Array de colunas de chave primária. Cada elemento contém |
|
|
Array de colunas de atributo. Cada elemento contém: |
Etapa 4: Escrever e testar o código da função
Após crie o trigger, escreva o código da função para processar o payload de eventos do Tablestore. A função é invocada automaticamente quando os dados da tabela são alterados.
-
Na página de detalhes da função, clique em na aba Code, insira o código da função e clique em em Deploy. O exemplo Python a seguir lê registros de eventos do Tablestore e extrai valores de chave primária e colunas de atributo:
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' Clique em em Test Function.
Após a execução, visualize os resultados na aba Code.
Perguntas frequentes
Por que a criação do trigger falha em uma região específica?
Os triggers do Tablestore estão disponíveis apenas em determinadas regiões. Verifique a seção Limitations para confirme se há suporte à sua região.
Por que não consigo encontrar minha tabela do Tablestore ao crie um trigger?
A tabela do Tablestore deve residir na mesma região da função. Se a tabela estiver em uma região diferente, ela não aparecerá na configuração do trigger.
Por que continuo vendo erros "Invocation canceled by client"?
Esse erro geralmente indica que o tempo limite do lado do cliente é menor que a duração real da execução da função. Aumente o período de tempo limite do cliente. Para mais detalhes, consulte What do I do if the client is disconnected and the message "Invocation canceled by client" is reported?.
Por que meu trigger do Tablestore não dispara após a gravação de dados na tabela?
Verifique os seguintes pontos:
Confirme se o recurso Stream está ativado para a tabela. Consulte Step 1: Enable the Stream feature for the data table.
Confirme se a função correta (
AliyunTableStoreStreamNotificationRole) foi configurada durante a criação do trigger. Consulte Step 2: Create a Tablestore trigger.Verifique os logs de execução da função para identificar possíveis falhas. Se a função falhar repetidamente, novas tentativas ocorrerão até que os dados de log expirem. Consulte What do I do if a trigger cannot trigger function execution?.