2020-05-31【腾讯云和阿里云Serverless体验对比(1)】

像向日葵一样心向阳光

今日鸡汤

我一直相信一句话:无论你遇见谁,他都是你生命该出现的人,绝非偶然,他一定会教会你什么。所以我也相信:无论我走到哪里,那都是我该去的地方,经历一些我该经历的事,遇见我该遇见的人。

最近在学习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的场景有四个:

  1. 基于函数计算实现快速建站: 使用Function Compute快速部署一个wordpress网站。
  2. 基于函数计算实现AI推理: 使用Function Compute 部署Tensorflow Serverless 平台,实现上传图片进行猫狗识别。
  3. 基于小程序Serverless开发个人相册小程序: 使用小程序Serverless的开发能力快速部署一个相册小程序。
  4. 快速搭建Serverless小商城: 使用Function Compute部署litemall商城。

场景2 基于函数计算实现AI推理

首先做了第二个实验,它是Serverless和AI结合的一个场景,通过使用阿里云的函数计算产品Function Compute来部署深度学习模型。对于AI 推理这样的 CPU 密集型任务,通过函数计算能够降低成本且保证弹性高可用,因此是Serverless的主要适用场景。

需要开通的服务

这个实验需要开通4项阿里云服务,依次是函数计算服务,文件存储服务NAS、专有网络VPC和日志服务。其中 NAS 用于存储函数计算需要的依赖包,日志服务用于记录运行时Log。

  1. 函数计算服务
    计费方式为按量计费,但目前还没有收费。

    函数计算控制台

  2. 文件存储服务NAS
    计费方式为按量1GB 0.42元/每月,可选通用型、极速型和CPFS,这里选了最便宜的通用型。

    NAS控制台

  3. 专有网络VPC
    VPC是云上私有网络,可以选择IP地址范围、配置路由表和网关等。每个VPC由一个路由器、至少一个私网网段和至少一个交换机组成。在初始化NAS的时候会使用已创建的VPC或新建一个VPC并与NAS关联。

    VPC控制台

  4. 日志服务
    计费方式为按量1 GB 0.18元,500M以下免费。

    日志服务控制台

命令行工具Fun

Fun是一个用于支持 Serverless 应用部署的工具,能管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),来进行开发、构建和部署操作。

  1. 安装
    可以使用npm、二进制安装和Homebrew三种方式来安装命令,还是比较方便的。

  2. 配置
    执行fun config命令配置已经开通的函数计算服务信息,

    fun config 配置函数计算服务信息

项目结构

项目源码在github cat-dog-classify,首先clone下来,查看代码结构。核心为三个文件:

  1. 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
  1. predict.py
    核心逻辑,有三个核心函数:
  • home(): 拦截所有GET和POST请求,当点击了页面上predict的button后,请求会被拦截进入这个函数,获得页面上的信息(主要为图片信息),调用predict()方法,并把返回的预测值填回网页端。
  • predict(): 在环境初始化时,会加载model.json里面定义的Conv2D模型,在这个函数中直接调用进行预测。
  • handler(): 解析环境变量fc.request_urifc_context,设置HTTP_HOSTSCRIPT_NAME
  1. 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。
服务信息

开始识别猫狗啦~

  1. 安装依赖
    使用fun install -v根据Funfile里定义的逻辑安装依赖。整个过程基于docker,最后会把所有内容打包成一个docker image。
fun install (1)

fun install (2)

运行完后会生成一个docker image
  1. 将第三方依赖上传到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
  1. 部署
    执行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
  1. 测试
    在浏览器打开log中显示的temporary domain,可以看到经过了漫长的冷启动(主要在花时间import Karas)后打开了网页。在上传照片点击predict后,可以看到发送了一个POST请求给函数计算服务器,之后调用我们部署的函数,返回并显示计算结果。
    image.png

冷启动优化——预留实例方式

函数计算提供了两种类型的资源:按量实例和预留实例

  • 按量实例是指函数实例的分配和释放完全由函数计算系统负责,有函数调用请求时,函数计算动态调度资源,为用户提供弹性可靠的执行环境,极大简化了用户管理应用资源的难度。但是资源的动态调度不可避免地存在冷启动延时,对于时延敏感的在线业务有一定影响。
  • 预留实例是将函数实例的分配和释放交由用户管理,根据实例的运行时长计费。预留实例的执行环境是长驻的,彻底消除冷启动对业务的影响。当预留了实例,函数计算系统收到函数调用请求的时候,会优先将请求转发给预留实例,当函数请求的峰值超过预留实例处理能力时,剩余的部分请求将会进入按量模式,由函数计算系统自动分配执行环境。预留实例计费时长从实例预留成功后执行代码开始,到实例成功释放后代码执行完毕为止。

本来想试一下,结果告诉我我的账号不支持预留资源的功能,心塞。


image.png

那就看看视频吧,预留操作视频在这里。

还是需要根据日常的访问量来确定最合适的预留实例数,是阿里比较推荐的消除冷启动的方式,有机会可以试试看做个压测。

打算再做一个小程序的场景体验一下,再写总结。

(未完待续)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335