通过函数计算访问表格存储,对表格存储增量数据进行实时计算。
背景信息
函数计算(Function Compute,简称FC)是事件驱动的全托管计算服务。使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码或镜像。函数计算为您准备好计算资源,弹性地、可靠地运行任务,并提供日志查询、性能监控和报警等功能。更多信息,请参见什么是函数计算。
Tablestore Stream是用于获取Tablestore表中增量数据的一个数据通道,通过创建Tablestore触发器,能够实现Stream和函数计算的自动对接,让计算函数中自定义的程序逻辑自动处理Tablestore表中发生的数据修改。
使用场景
使用函数计算可以实现如下任务,如下图所示。
数据同步:同步表格存储中的实时数据到数据缓存、搜索引擎或者其他数据库实例中。
数据归档:增量归档表格存储中的数据到OSS等做冷备份。
事件驱动:利用触发器触发函数调用IoT套件、云应用API或者做消息通知等。

准备工作
注意事项
请确保表格存储数据表与函数计算服务处于同一地域。
步骤一:为数据表开启Stream功能
使用触发器功能需要先在表格存储控制台开启数据表的Stream功能,才能在函数计算中处理写入表格存储中的增量数据。
登录表格存储控制台。
在页面上方,选择地域。
在概览页面,单击实例名称或在实例操作列单击实例管理。
在实例详情页签的数据表列表页签,单击数据表名称后选择实时消费通道页签或单击
后选择实时消费通道。
在实时消费通道页签,单击Stream信息对应的开启。
在开启Stream功能对话框,设置日志过期时长,单击开启。
日志过期时长取值为非零整数,单位为小时,最长时长为168小时。
重要日志过期时长设置后不能修改,请谨慎设置。
步骤二:配置Tablestore触发器
在函数计算控制台创建Tablestore触发器来处理Tablestore数据表的实时数据流。
表格存储只支持使用内置运行时创建的方式创建函数。
进入函数管理页签。
登录函数计算控制台。
在左侧导航栏,单击服务及函数。
在页面上方,选择地域。
在服务列表页面,单击目标服务名称。
在函数管理页签,单击创建函数。
在创建函数页面,配置函数信息。
选择创建函数的方式为使用内置运行时创建。
在基本设置区域,填写函数名称,并选择请求处理程序类型为处理事件请求。
处理事件请求表示通过定时器、调用API/SDK或其他阿里云服务的触发器来触发函数执行。
说明如果未填写函数名称,函数计算会自动为您生成函数名称。
在函数代码区域,根据下表说明配置函数代码信息。
参数
说明
运行环境
选择您熟悉的语言,例如Python、Java、PHP、Node.js等。此处选择Python 3.9。
函数计算支持的运行环境,请参见函数计算支持的函数运行环境列表。
代码上传方式
上传函数代码到函数计算的方式。取值范围如下:
使用示例代码(默认):根据业务需要选择函数计算为您提供的创建函数的示例代码。
通过ZIP包上传代码:选择函数代码ZIP包。
通过文件夹上传代码:选择包含函数代码的文件夹。
通过OSS上传代码:选择上传函数代码的Bucket名称和文件名称。
此处请选择使用示例代码后,在示例代码列表中选择表格存储TableStore触发函数。
在高级配置区域,根据下表说明配置函数的实例相关信息和函数执行超时时间等。
参数
说明
规格方案
选择或手动输入合理的vCPU规格和内存规格组合。关于各资源使用的计费详情,请参见函数计算计费概述。
重要vCPU大小(核)与内存大小(GB)的比值必须在1:1到1:4之间。
临时硬盘大小
函数实例中的用于临时存储文件的磁盘,临时磁盘会被挂载到实例的根目录。
选择临时存储文件的硬盘大小。取值范围如下:
512 MB(默认):不计费,函数计算为您提供512 MB以内的硬盘免费使用额度。
10 GB:按9.5 GB进行计费。
重要临时硬盘大小与底层执行函数的实例生命周期一致,实例被系统回收后,硬盘上的数据也会清除。
实例并发度
单个函数实例可以同时处理的请求数。更多信息,请参见设置实例并发度。
执行超时时间
执行函数的超时时间。默认值为60秒,最大值为86400秒。
如果函数在该时间内未能成功执行,则函数计算会返回超时错误。
请求处理程序
函数计算运行时会加载并调用您的请求处理程序处理请求。
时区
函数计算的运行环境默认使用UTC时间,您可以通过配置TZ环境变量进行修改。修改时区后,函数计算将会自动为函数添加TZ环境变量,TZ环境变量的值为您设置的目标时区。
(可选)在环境变量区域,设置函数运行环境中的环境变量。更多信息,请参见环境变量。
在触发器配置区域,根据下表说明填写触发器相关参数。
参数
说明
触发器类型
选择表格存储Tablestore。
名称
自定义填写触发器名称。
实例
在下拉列表中选择已创建的Tablestore实例。
表格
在下拉列表中选择已创建的数据表。
角色名称
选择AliyunTableStoreStreamNotificationRole。
说明如果您第一次创建该类型的触发器,则需要单击创建后,在弹出的对话框中选择立即授权,并根据系统提示完成角色创建和授权。
单击创建。
创建好的触发器会自动显示在触发器管理页签。
说明您也可以在表格存储控制台中数据表的触发器管理页签,查看和创建Tablestore触发器。
步骤三:验证测试
函数计算支持函数的在线调试功能,您可以构建触发的Event,并测试代码逻辑是否符合期望。
由于Tablestore触发函数服务的Event是CBOR格式,该数据格式是一种类似JSON的二进制格式,可以按照如下方法进行在线调试。
编写代码。
在函数管理页签,单击函数名称。
在函数详情页面,单击函数代码页签,在代码编辑器中编写代码。
说明此处以Python函数代码为例介绍。
在代码中使用
records = json.loads(event)
处理自定义的测试触发事件。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'
验证测试。
在函数代码页签,单击测试函数右侧的
图标后,从下拉列表中选择配置测试参数。
在配置测试参数对话框,选择创建新测试事件页签,选择事件模板为Tablestore,并填写事件名称和事件内容。单击确定。
说明如果已创建Tablestore测试事件,您可以在编辑已有测试事件页签,选择已有事件名称。
关于事件内容数据格式的更多信息,请参见附录:数据处理。
单击测试函数,查看是否符合期望。
修改代码并部署代码。
当使用
records=json.loads(event)
测试OK后,修改records
代码为records = cbor.loads(event)
。单击部署代码。
当Tablestore中有数据写入时,相关的函数逻辑就会触发。
附录:数据处理
配置测试参数时,需要按照特定的数据格式设置事件内容。
数据格式
Tablestore触发器使用CBOR格式对增量数据进行编码构成函数计算的Event。增量数据的具体数据格式如下:
{ "Version": "string", "Records": [ { "Type": "string", "Info": { "Timestamp": int64 }, "PrimaryKey": [ { "ColumnName": "string", "Value": formated_value } ], "Columns": [ { "Type": "string", "ColumnName": "string", "Value": formated_value, "Timestamp": int64 } ] } ] }
成员定义
成员定义请参见下表。
参数
说明
Version
payload版本号,目前为Sync-v1。类型为string。
Records
数据表中的增量数据行数组。包含如下内部成员:
Type:数据行类型,包含PutRow、UpdateRow和DeleteRow。类型为string。
Info:包含Timestamp内部成员。Timestamp表示该行的最后修改UTC时间。类型为int64。
PrimaryKey
主键列数组。包含如下内部成员:
ColumnName:主键列名称。类型为string。
Value:主键列内容。类型为formated_value,支持integer、string和blob。
Columns
属性列数组。包括如下内部成员:
Type:属性列类型,包含Put、DeleteOneVersion和DeleteAllVersions。类型为string。
ColumnName:属性列名称。类型为string。
Value:属性列内容。类型为formated_value,支持integer、boolean、double、string和blob。
Timestamp:属性列最后修改UTC时间。类型为int64。
数据示例
{ "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 } ] } ] }
附录:使用已有函数计算创建Tablestore触发器
在表格存储控制台,使用已有函数计算的服务以及服务下的函数创建Tablestore触发器。
登录表格存储控制台。
在概览页面,单击实例名称或在实例操作列单击实例管理。
在实例详情页签的数据表列表区域,单击数据表名称。
在触发器管理页签,单击使用已有函数计算。
在创建触发器对话框,选择函数计算服务以及服务下的函数,并填写触发器名称,单击确定。