2020-05-31【腾讯云和阿里云Serverless体验对比
![](https://img.haomeiwen.com/i20396442/b06ec65996b97593.jpg)
今日鸡汤
我一直相信一句话:无论你遇见谁,他都是你生命该出现的人,绝非偶然,他一定会教会你什么。所以我也相信:无论我走到哪里,那都是我该去的地方,经历一些我该经历的事,遇见我该遇见的人。
最近在学习Serverless,分别尝试了一下腾讯云和阿里云提供的Serverless,选择几个场景做了实验,特来总结一下。由于篇幅和本宝宝精力限制,将分几篇来更。
今天先看阿里云的Serverless产品和使用体验。
阿里云的serverless产品
阿里云的Serverless相关产品主要有4个:
- 函数计算(Function Compute):事件驱动的全托管Serverless计算服务。
- Serverless应用引擎(Serverless App Engine, SAE):面向应用的Serverless PaaS平台,支持Spring Cloud、Dubbo等开发框架,支持war、jar、镜像三种方式部署,网络上通过VPC强隔离,我理解就是PaaS层应用管理平台。
- Serverless工作流(Serverless Workflow):协调多个分布式任务执行的全托管Serverless云服务,可用顺序、分支、并行等方式编排分布式任务,管理流程执行中的所有状态。
- Serverless Kubernetes(ASK:阿里云推出的Serverless版本的Kubernetes容器服务。用户不需要购买节点就可以部署容器应用,也不需要对集群进行节点维护和容量规划,可以说是把Kubernetes也做进了基础设施层,实现用户不需要管理Kubernetes节点和服务器,是在ACK的基础上增加了Serverless动态扩缩容的能力。
Serverless场景
推荐一篇Serverless应用场景的文章Serverless应用场景,介绍了Serverless的演进和四个场景(事件触发场景、视频直播多人连麦场景、物联网数据处理场景和共享派单场景)。
阿里云开发者社区的云体验平台内置了很多云产品的体验场景。关于Serverless的场景有四个:
- 基于函数计算实现快速建站: 使用Function Compute快速部署一个wordpress网站。
- 基于函数计算实现AI推理: 使用Function Compute 部署Tensorflow Serverless 平台,实现上传图片进行猫狗识别。
- 基于小程序Serverless开发个人相册小程序: 使用小程序Serverless的开发能力快速部署一个相册小程序。
- 快速搭建Serverless小商城: 使用Function Compute部署litemall商城。
场景2 基于函数计算实现AI推理
首先做了第二个实验,它是Serverless和AI结合的一个场景,通过使用阿里云的函数计算产品Function Compute来部署深度学习模型。对于AI 推理这样的 CPU 密集型任务,通过函数计算能够降低成本且保证弹性高可用,因此是Serverless的主要适用场景。
需要开通的服务
这个实验需要开通4项阿里云服务,依次是函数计算服务,文件存储服务NAS、专有网络VPC和日志服务。其中 NAS 用于存储函数计算需要的依赖包,日志服务用于记录运行时Log。
-
函数计算服务
计费方式为按量计费,但目前还没有收费。
函数计算控制台
-
文件存储服务NAS
计费方式为按量1GB 0.42元/每月,可选通用型、极速型和CPFS,这里选了最便宜的通用型。
NAS控制台
-
专有网络VPC
VPC是云上私有网络,可以选择IP地址范围、配置路由表和网关等。每个VPC由一个路由器、至少一个私网网段和至少一个交换机组成。在初始化NAS的时候会使用已创建的VPC或新建一个VPC并与NAS关联。
VPC控制台
-
日志服务
计费方式为按量1 GB 0.18元,500M以下免费。
日志服务控制台
命令行工具Fun
Fun是一个用于支持 Serverless 应用部署的工具,能管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),来进行开发、构建和部署操作。
-
安装
可以使用npm、二进制安装和Homebrew三种方式来安装命令,还是比较方便的。 -
配置
执行fun config
命令配置已经开通的函数计算服务信息,
fun config 配置函数计算服务信息
项目结构
项目源码在github cat-dog-classify,首先clone下来,查看代码结构。核心为三个文件:
- Funfile
有点儿像docker file,定义了需要安装的依赖包。
RUNTIME python3
RUN fun-install pip install flask==1.1.1 -t /mnt/auto
RUN fun-install pip install scipy==1.1.0 -t /mnt/auto
RUN fun-install pip install Pillow -t /mnt/auto
RUN fun-install pip install scikit-learn -t /mnt/auto
RUN fun-install pip install scikit-image -t /mnt/auto
RUN fun-install pip install keras -t /mnt/auto
RUN fun-install pip install h5py -t /mnt/auto
RUN fun-install pip install tensorflow==1.13.1 -t /mnt/auto
COPY ./model /mnt/auto/model
- predict.py
核心逻辑,有三个核心函数:
-
home()
: 拦截所有GET和POST请求,当点击了页面上predict的button后,请求会被拦截进入这个函数,获得页面上的信息(主要为图片信息),调用predict()
方法,并把返回的预测值填回网页端。 -
predict()
: 在环境初始化时,会加载model.json里面定义的Conv2D模型,在这个函数中直接调用进行预测。 -
handler()
: 解析环境变量fc.request_uri
和fc_context
,设置HTTP_HOST
和SCRIPT_NAME
。
- template.yml
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
classify:
Type: 'Aliyun::Serverless::Service'
Properties:
NasConfig: Auto
LogConfig:
Project: 'claire-ai-pro'
Logstore: 'fc-log'
cat-dog:
Type: 'Aliyun::Serverless::Function'
Properties:
Initializer: predict.initializer
InitializationTimeout: 300
Handler: predict.handler
Runtime: python3
CodeUri: './'
EnvironmentVariables:
model_path: /mnt/auto/model
Timeout: 120
MemorySize: 1024
Events:
http-test:
Type: HTTP
Properties:
Qualifier: LATEST
AuthType: ANONYMOUS
Methods: ['GET', 'POST', 'PUT']
claire-ai-pro:
Type: 'Aliyun::Serverless::Log'
Properties:
Description: 'fc serverless ai project'
fc-log:
Type: 'Aliyun::Serverless::Log::Logstore'
Properties:
TTL: 10
ShardCount: 1
my_domain:
Type: 'Aliyun::Serverless::CustomDomain'
Properties:
DomainName: Auto
Protocol: HTTP
RouteConfig:
Routes:
'/*':
ServiceName: classify
FunctionName: cat-dog
FUN根据template.yml里面定义的来部署Serverless应用。可以看到,里面定义了一个Service(classify)、一个Function(cat-dog)和一个HTTP方式的event。其中,
- Service classify需要NAS服务做文件存储和Log服务记录日志。
- Function cat-dog使用
predict.initializer
方法做初始化(主要设置环境变量),使用predict.handler
方法做handler。
![](https://img.haomeiwen.com/i20396442/2fb6a63292550caa.png)
开始识别猫狗啦~
-
安装依赖
使用fun install -v
根据Funfile里定义的逻辑安装依赖。整个过程基于docker,最后会把所有内容打包成一个docker image。
![](https://img.haomeiwen.com/i20396442/e2d08b275dbbf4b0.png)
![](https://img.haomeiwen.com/i20396442/b7a0e3f9c2ae6001.png)
![](https://img.haomeiwen.com/i20396442/2d7721eebf9e7607.png)
-
将第三方依赖上传到NAS
一般来说,NAS上会存放一些体积比较大且不易变动的资源。因此很适合使用NAS存放这些比较大的依赖资源。在 Fun 2.16.0 有一个新的配置项NasConfig: Auto
。通过该属性,可以一键将 NAS 及其依赖的 VPC 资源一同创建出来。
第一步, 首先使用fun nas init
命令初始化NAS,FUN会根据.env中的信息自动获取或创建NAS。
(base) localhost:cat-dog-classify claire$ fun nas init
using template: template.yml
start fun nas init...
checking if _FUN_NAS_classify needs to be deployed...
Waiting for service _FUN_NAS_classify to be deployed...
make sure role 'aliyunfcgeneratedrole-cn-beijing-classify' is exist
role 'aliyunfcgeneratedrole-cn-beijing-classify' is already exist
attaching police 'AliyunECSNetworkInterfaceManagementAccess' to role: aliyunfcgeneratedrole-cn-beijing-classify
attached police 'AliyunECSNetworkInterfaceManagementAccess' to role: aliyunfcgeneratedrole-cn-beijing-classify
using 'VpcConfig: Auto', Fun will try to generate related vpc resources automatically
vpc already generated, vpcId is: vpc-2z************************owkgsl
vswitch already generated, vswitchId is: vsw-2z************rpcq1skano
security group already generated, security group is: sg-2z*************9k9yn
generated auto VpcConfig done: {"vpcId":"vpc-2z************wkgsl","vswitchIds":["vsw-2z************kano"],"securityGroupId":"sg-2z************9yn"}
using 'NasConfig: Auto', Fun will try to generate related nas file system automatically
nas file system already generated, fileSystemId is: 16f************3e
nas file system mount target is already created, mountTargetDomain is: 16f************3e-wlt63.cn-beijing.nas.aliyuncs.com
generated auto NasConfig done: {"UserId":10003,"GroupId":10003,"MountPoints":[{"ServerAddr":"16************3e-wlt63.cn-beijing.nas.aliyuncs.com:/classify","MountDir":"/mnt/auto"}]}
Checking if nas directories /classify exists, if not, it will be created automatically
Checking nas directories done ["/classify"]
Waiting for function fun-nas-function to be deployed...
Waiting for packaging function fun-nas-function code...
The function fun-nas-function has been packaged.
Waiting for HTTP trigger httpTrigger to be deployed...
triggerName: httpTrigger
methods: [ 'POST', 'GET' ]
url: https://13************7166.cn-beijing.fc.aliyuncs.com/2016-08-15/proxy/_FUN_NAS_classify/fun-nas-function/
Http Trigger will forcefully add a 'Content-Disposition: attachment' field to the response header, which cannot be overwritten
and will cause the response to be downloaded as an attachment in the browser. This issue can be avoided by using CustomDomain.
trigger httpTrigger deploy success
function fun-nas-function deploy success
service _FUN_NAS_classify deploy success
Create local NAS directory of service classify:
/Users/claire/Innovation/serverless/Ali/cat-dog-classify/.fun/nas/auto-default/classify
fun nas init Success
第二步, 使用fun nas sync
命令将本地NAS中的内容上传到NAS中的目录中。
(base) localhost:cat-dog-classify claire$ fun nas sync
using template: template.yml
starting upload /Users/claire/Innovation/serverless/Ali/cat-dog-classify/.fun/nas/auto-default/classify to nas://classify/mnt/auto/
start fun nas init...
checking if _FUN_NAS_classify needs to be deployed...
skip deploying _FUN_NAS_classify, which has been deployed
fun nas init Success
zipping /Users/claire/Innovation/serverless/Ali/cat-dog-classify/.fun/nas/auto-default/classify
✔ upload done
unzipping file
✔ unzip done
✔ upload completed!
Tips for next step
======================
$ fun nas info # Show NAS info
$ fun nas ls # List NAS files
$ fun nas sync # Synchronize files to nas
$ fun deploy # Deploy Resources
-
部署
执行fun deploy
将service和函数部署到阿里云。
Request a new temporary domain ...
The assigned temporary domain is 20902385-138**********166.test.functioncompute.com,expired at 2020-06-10 13:19:45, limited by 1000 per day.
Waiting for custom domain my_domain to be deployed...
custom domain my_domain deploy success
-
测试
在浏览器打开log中显示的temporary domain,可以看到经过了漫长的冷启动(主要在花时间import Karas)后打开了网页。在上传照片点击predict后,可以看到发送了一个POST请求给函数计算服务器,之后调用我们部署的函数,返回并显示计算结果。
image.png
冷启动优化——预留实例方式
函数计算提供了两种类型的资源:按量实例和预留实例
- 按量实例是指函数实例的分配和释放完全由函数计算系统负责,有函数调用请求时,函数计算动态调度资源,为用户提供弹性可靠的执行环境,极大简化了用户管理应用资源的难度。但是资源的动态调度不可避免地存在冷启动延时,对于时延敏感的在线业务有一定影响。
- 预留实例是将函数实例的分配和释放交由用户管理,根据实例的运行时长计费。预留实例的执行环境是长驻的,彻底消除冷启动对业务的影响。当预留了实例,函数计算系统收到函数调用请求的时候,会优先将请求转发给预留实例,当函数请求的峰值超过预留实例处理能力时,剩余的部分请求将会进入按量模式,由函数计算系统自动分配执行环境。预留实例计费时长从实例预留成功后执行代码开始,到实例成功释放后代码执行完毕为止。
本来想试一下,结果告诉我我的账号不支持预留资源的功能,心塞。
![](https://img.haomeiwen.com/i20396442/c9852f21258d20ec.png)
那就看看视频吧,预留操作视频在这里。
还是需要根据日常的访问量来确定最合适的预留实例数,是阿里比较推荐的消除冷启动的方式,有机会可以试试看做个压测。
打算再做一个小程序的场景体验一下,再写总结。
(未完待续)