综述
阿里云的函数计算是2017年4月份发布,并于同年10月份正式商业化,是一款基于Serverless这种架构下实现的一款轻计算高弹性的产品。下面会讲解基于函数计算作为数据处理并分发后的场景。场景描述是这样,函数计算作为一个后端数据处理服务跟表格存储结合起来,主要是数据驱动后续的分发行为。函数计算可以对存储到表格存储里的数据进行准实时处理(目前可以定义1秒触发一次、一次传输100条记录),通过触发器函数计算能够监控到表格存储里数据的增、删、改等操作,当批量数据在表格存储被修改后,触发器会通知函数来进行处理。
常见的场景是,表格里的某个字段的数据被修改后,需要把变化内容通过消息通道或者通过移动推送给手机端。例如您的某个消息被回复,或者您发的帖子被删除或者置顶等操作后即可触发函数计算对数据处理后来通知你。
使用传统的架构处理通常是数据写入到表格存储后,需要写一个定时任务来拉取最新更新的数据然后再进行后续处理,在这里有几个技术问题需要关注:
1、 如何获取表格中最新更新的记录。
2、 定时器设置成多少才不成为应用瓶颈。
3、 如果更新的数据量较大,一次处理多少条数据。
4、 处理后的数据,需要写分发程序来调用其他资源。
5、 如果数据量更新较大,而超过一台服务器处理能力,怎么做负载均衡来分散处理请求。
传统IT架构图:
架构图讲解:接入端(手机、WEB端等)的请求把数据写入表格存储,后端云服务器拉取表格存储的数据进行处理,并把处理后的数据分发到例如消息通道,移动推送等。
针对上述提出的技术问题,可以通过函数计算+表格存储+消息通道较为完美的解决上述问题。用表格存储触发器+函数计算的架构如下:
通过架构对比,能看出最大的变化在用函数计算替换掉多台云服务器,这样的变动带来的好处有很多:
1、 函数计算和表格存储产品打通,可以通过控制台上简单配置即可完成两个产品的数据打通,详见下面讲解。
2、 函数计算在多并发的时候能弹性伸缩,不需要考虑当大量数据更新后怎么处理弹性问题。表格存储会间隔1秒把批量把更新的数据透传给函数计算,当一秒内处理不完请求,会启动新的执行环境来处理后续的请求。
3、 业务逻辑编写到函数计算里,处理好数据后,通过接口调用直接把数据发送给移动推送、消息通道等产品。
4、 函数计算是按照触发来计费,业务低谷期的费用非常低廉,不需要额外维护一些服务环境。
场景描述
下面根据上述的场景图,来细化每一步操作,按照步骤可以完成整个场景的搭建,整体流程图如下
下面章节会根据上述流程,把完整的操作步骤描述出来。
开通产品
在开始步骤之前,需要先开通以下产品,通过阿里云官网首页,找到各个产品详情页,并开通服务,这三个产品都是按量付费产品,开通流程都比较简单。
函数计算产品详情页:https://www.aliyun.com/product/fc
表格存储产品详情页:https://www.aliyun.com/product/ots
消息队列产品详情页:https://www.aliyun.com/product/mns
开通产品后,进入控制台,进行一些设置,开通流程可以参考如下几篇文章:
控制台的配置
表格存储的配置
分别开通上述产品后,需要对产品的联通进行配置,需要打通的产品如,函数计算和表格存储,函数计算和消息通道等,配置都相对简单,下面会使用少量界面图来引导每一步操作。
详细可以参考这篇文档 在表格存储使用函数计算。
打开表格存储的控制台,进入控制台创建实例->管理->创建数据表,在创建数据表的时候,请注意勾选上开启Stream方式,只有开启Stream方式,表格存储才会触发把更新的数据传输给函数计算。
在表格存储的管理界面里,选择触发器管理,如果原先已经写好的函数计算,可以选择,如果没有,可以跳转到函数计算创建页面进行创建,这个地方需要注意,为了保障网络延迟较小,表格存储和函数计算需要在同一个区域,详见下面配置好的页面。
注意点:
1、 数据表的区域需要和函数计算在同一个区域
2、 第一次使用函数计算触发器会提示角色授权
3、 一张表下只能创建一个触发器
4、 触发器是按照1秒执行一次,一次传输100条数据,依次处理。
函数计算的配置:
进入函数计算的控制台,开通服务后,选择跟表格存储同一个区域的创建一个新函数,选择一个空白模板,选择python语言,设置好相关信息,这里需要注意的是程序入口函数编写。Python语言的编写需要参考产品文档中的内容,其中入口函数和事件源的详细内容可以参考这篇文章。配置好的界面如下面图所示,
其中有几个地方需要注意:
1、 入口函数的编写
2、 运行语言版本
3、 执行所需要内存和超时时间,执行所需要的内存跟程序执行的资源相关,缺省可以使用128MB,超时时间不能小于程序执行时间,最长能设置300秒。
选择在线编辑代码,代码编写页面:
代码编写结束后,直接可以执行来调试,其中触发事件是为了让开发者可以在控制台上模板输入来进行调试。
消息通道的配置
消息通道不需要配置,开通即可使用,函数计算往消息通道发送信息的代码可以直接嵌入对应的SDK即可。
编写业务代码
完成上述配置后,进入编写业务代码,业务代码的编写都在函数计算里,其中逻辑会包含两段逻辑,第一段逻辑是接收表格存储推送过来的数据,第二段逻辑是把处理好的数据回写到表格存储中或者调用消息通道,并填写主题内容,详解图解:
第一段逻辑,接收表格存储的数据,可以参考详细文档。
示例代码稍后提供
第二块代码是把数据回写到表格存储中
示例代码稍后提供
第二段逻辑,把数据通知消息通道,
示例代码稍后提供
以上代码需要注意的事项如:
1、 函数计算的python运行环境缺省带了表格存储产品的SDK,所以不需要额外再安装。
2、 注意Python的书写格式,编辑器目前还无法校验语法错误。
调试程序
编写好业务代码,一般都需要进行调试,在函数计算里提供了事件源模拟器,详解下图:
其中触发事件是主要为了让开发进行输入值的调试,例如期望程序拿到什么样的值,这个地方就可以模拟来是。在调试表格存储代码的时候,需要注意,表格存储触发器发送过来的数据是二进制的方式,为了方便调试,触发事件源可以用json串来模拟,正式使用的时候,把
records = cbor.loads(event) 注释去掉,records = json.loads(event)注释掉即可。
事件源的示例json串如下:
{
"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
}
]
}
]
}
结果汇总
设置好内容后,可以在控制台上执行看看,执行结果会显示很多内容,执行摘要里会带内存使用情况,执行时间,实际使用内存等等。同时会把执行过程中的日志也打印出来。
通过模拟器测试结果后,可以真实的跑一次应用看看,往表格存储里写入一些新记录,看看有没有触发后续的处理。