函数计算: 让小程序开发进入 Serverless 时代
点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》

本文节选自《不一样的 双11 技术:阿里巴巴经济体云原生实践》一书,点击上方图片即可下载!
作者 | 吴天龙(木吴)阿里云函数计算技术专家
导读:小程序是轻量级的快速迭代的移动应用,对开发者从开发到上线的效率提出了更高的要求。使用函数计算,开发者无需关心后端服务的搭建运维,只需要编写函数就能够为小程序提供稳定可靠并且弹性伸缩的服务。并且随着小程序访问量增加,函数计算能够自动快速地弹性伸缩,即使应对 双11 活动高峰也能够如丝般顺滑。
自 2017 年第一批小程序上线以来,越来越多的移动端应用以小程序的形式呈现。小程序拥有触手可及、用完即走的优点,这大大降低了用户的使用负担,使小程序得到了广泛的传播。在阿里巴巴,小程序也被广泛地应用在淘宝/支付宝/钉钉/高德等平台上,例如今年 双11,大家在淘宝/天猫上参加的活动,大部分都是通过小程序提供的。
一个小程序可以分为客户端和服务端:客户端包括界面的展示和交互逻辑;服务端则包括数据的处理和分析。
为了支撑大量的小程序,平台在服务端面临的挑战有:
- 大量的小程序是不活跃的,传统的至少一台服务器的方式会造成资源浪费;
- 在活动高峰期小程序的调用量激增,要求服务端能够快速进行弹性伸缩。
针对小程序场景,阿里云提供了完整的小程序解决方案:小程序云。资源的有效利用和弹性伸缩,是小程序云提供的核心能力之一,而这背后依托的,就是阿里云函数计算服务。函数计算是一个全托管 Serverless 计算服务,让开发者无需管理服务器等基础设施,只需编写和上传代码,就能够构建可靠、弹性、安全的服务。下面就以 双11 小程序场景为例,解析函数计算在弹性伸缩上的核心技术。
小程序架构
让我们先来看一下淘宝小程序的技术架构是什么样的:

- 用户在手机淘宝点击店铺活动,就进入了小程序。界面及交互由小程序客户端提供;
- 在用户参与活动过程中,需要向服务端请求或者发送数据时,由客户端发起函数调用;
- 函数调用先经过淘宝接入网关,进行必要的鉴权认证,然后调用到小程序云;
- 用户的函数代码执行在小程序云中,用户可以实现自定义的业务逻辑。
利用小程序云提供的丰富的扩展能力,用户可以方便地构建完整的电商应用:
- 数据存储:存储结构化的数据;
- 文件存储:存储文本/图片/视频等文件;
- 电商服务:获取用户信息/创建支付交易;
- 统计分析:自动统计小程序的使用信息及用户分析,支撑商业决策。
可以看到,函数是整个小程序的业务逻辑的核心,它将云端的基础能力组合串联起来,对客户端提供服务能力。如果函数能力成为瓶颈,将影响整个小程序的运行。
在这样的架构下,要支撑大量的小程序,需要函数能够做到:
- 一是随时在线以支持小程序即开即用;
- 二是弹性伸缩以应对小程序访问突增。为了做到以上两点,让我们看一下函数计算的技术架构:
函数计算架构

其中几个核心组件的功能如下:
- API 服务:函数计算的网关,实现鉴权/流控等功能;
- 资源调度:为函数调用分配管理计算资源,负责调度效率和性能;
- 函数执行引擎:执行函数代码的环境,做到安全和隔离。
基于这个架构,函数计算是如何解决上面提到的小程序平台的挑战呢?接下来我们逐一分析。
1. 冷启动
当用户创建函数上传代码时,函数计算只是将代码包保存到 OSS,并没有分配计算资源,因此函数计算可以支撑海量的小程序。
当函数第一次被调用时,函数计算会分配计算资源、下载函数代码、加载并执行代码。这一过程称为冷启动,函数计算通过大量的优化,将系统侧的冷启动时间优化到 200ms 以内。因此即使是冷的小程序,在初次调用时也能够做到快速的即开即用。

2. 弹性伸缩
当小程序持续调用过程中,负载逐渐上升或者突然升高的情况下,函数计算是如何应对的呢?
函数计算的“资源调度”模块,会精确管理每个实例的状态,当请求到来时,它首先检查是否有空闲的实例可以服务,如果没有请求就会进入等待队列,当有空闲的实例释放出来时,请求就能够被及时处理。
同时,调度器还会在后台创建新的实例,当新的实例准备好后,也能够服务请求。在这种策略下,能够做到在负载以 2 倍的速度增长情况下,请求的 P95 延时是稳定的。优化细节可以参考我们的博客文章。

上面是某个淘宝小程序的调用量和延时监控数据。
可以看到,在整点活动时,TPS 出现了瞬间的高峰,但是 P95 延时却没有明显的波动。这是因为函数计算在请求高峰来临时,能够快速地弹性伸缩创建新的实例,同时利用已有资源做一定的缓冲,使得整个攀升的过程能够比较平滑。
3. 预留实例
对于一些“秒杀”的场景,要求瞬间提供大量的计算资源。此时靠实时的弹性伸缩是不够的:
- 一是冷启动的时间即使是 200ms,对于秒杀场景也太慢了;
- 二是底层的计算资源在扩容时也会有流控。
针对这种场景,函数计算提供了预留实例的功能。使用预留实例,用户可以为一些可预测的活动提前预留好资源,彻底消除冷启动。

和传统的基于服务器的做法不同,用户不需要按峰值来预留资源,而是可以结合预留实例和按量实例的混合模式:请求先被预留实例处理,当预留实例用满时,会自动弹性伸缩出更多的按量实例来处理请求。
由于有一定的资源基础,结合调度优化,按量实例的冷启动所产生的影响就被大大减小了。这就是利用函数计算的弹性伸缩能力,在性能和成本之间达到很好的平衡。
总结
小程序是轻量级的快速迭代的移动应用,对小程序开发者的开发效率有很高的要求。
小程序上线后随着访问量的增加或者活动期间的访问突增,对后端服务的稳定和弹性也是一个很大的考验。函数计算上传代码即可运行,极大地提高了后端服务的开发效率;混合模式的弹性伸缩,轻松应对负载变化。这些特点使得函数计算成为支撑小程序平台的很好的选择。
欢迎加入钉钉交流群

对函数计算感兴趣的开发者,可以点此免费试用)!

本书亮点
- 双11 超大规模 K8s 集群实践中,遇到的问题及解决方法详述
- 云原生化最佳组合:Kubernetes+容器+神龙,实现核心系统 100% 上云的技术细节
- 双 11 Service Mesh 超大规模落地解决方案
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”
函数计算: 让小程序开发进入 Serverless 时代的更多相关文章
- 一文搞懂EMAS Serverless小程序开发|电子书免费下载
>> 快来免费下载|电子书<五天玩转 EMAS Serverless> << 点击免费下载 <五天玩转 EMAS Serverless> EMAS Se ...
- 微信小程序开发——使用回调函数出现异常:TypeError: Cannot read property 'setData' of undefined
关键技术点: 作用域问题——回调函数中的作用域已经脱离了调用函数了,因此需要在回调函数外边把this赋给一个新的变量才可以了. 业务需求: 微信小程序开发,业务逻辑需要,需要把获取手机号码的业务逻辑作 ...
- 微信小程序开发 -- 通过云函数下载任意文件
微信小程序开发 -- 通过云函数下载任意文件 1.云开发介绍 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...
- 剖析简易计算器带你入门微信小程序开发
写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...
- 微信小程序开发BUG经验总结
摘要: 常见的微信小程序BUG! 小程序开发越来越热,开发中遇到各种各样的bug,在此总结了一些比较容易掉进去的坑分享给大家. 1. new Date跨平台兼容性问题 在Andriod使用new Da ...
- 微信小程序开发学习资料
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 微信小程序开发总结(详细)
转载: 小程序开发总结(详细) 这段时间一直在做小程序,总结下.后续可能会不断更新,努力写仔细点,争取让人看到就能会写. 一,页面结构. 这基本是小程序的标准目录结构.我们从上到下解释下:pages文 ...
- 小程序开发:用原生还是选框架(wepy/mpvue/uni-app/taro)?
小程序开发:用原生还是选框架(wepy/mpvue/uni-app/taro)? 自 2017-1-9微信小程序诞生以来,历经2年多的迭代升级,已有数百万小程序上线,成为继Web.iOS.Androi ...
- 微信小程序开发(二)----- 云开发
1.概念 微信小程序的云开发是腾讯云与微信团队深度合作推出的一个全新的小程序的解决方案,它提供了云函数.云数据库与云存储这三大基础能力支持,随着云开发的出现,小程序的开发者可以将服务端的部署和运营的环 ...
随机推荐
- nyoj 33-蛇形填数 (循环,模拟)
33-蛇形填数 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:15 submit:38 题目描述: 在n*n方陈里填入1,2,...,n*n,要求填 ...
- nyoj 75-日期计算 (闰年与平年的判断)
75-日期计算 内存限制:64MB 时间限制:3000ms 特判: No 通过数:19 提交数:31 难度:1 题目描述: 如题,输入一个日期,格式如:2010 10 24 ,判断这一天是这一年中的第 ...
- Pashmak and Parmida's problem(树状数组)
题目链接:http://codeforces.com/contest/459/problem/D 题意: 数列A, ai表示 i-th 的值, f(i,j, x) 表示[i,j]之间x的数目, 问:当 ...
- Json模块和Pickle模块的使用
在对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块.这两个模块主要区别如下: json 是一个文本序列化格 ...
- svn文件被锁不能提交的解决办法
记录工作中遇到的问题,分享出来: 前端时间在提交项目到svn遇到一个问题, 提交的时候提示:文件已经锁定!如下图: 原因是我之前提交的时候不小心中途停了,导致文件被锁,然后也没在意那么多, 趁着今天有 ...
- 20191017-3 alpha week 2/2 Scrum立会报告+燃尽图 02
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9799 一.小组情况 队名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 ...
- Excel 如何做不定长区间汇总统计
第一步:创建数据-区间 辅助表(注意:首列值必须以升序排列,为后面vlookup模糊匹配做准备) 第二步:用vlookup模糊匹配生成一个新的“金额区间”字段 第三步:以“金额区间”字段为行透视汇总
- 【Luogu P1981】表达式求值
点我进入原题Luogu P1981 [解题思路] 仔细分析题目,这就是一道模拟题…… 直接按照符号读入全部的数字,先算乘法,最后把全部数加起来就是结果了 记得要%10000取最后四位 [参考程序] # ...
- 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)
花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...
- HTML 空元素(转)
HTML 空元素 在 HTML 中,通常在一个空元素上使用一个闭标签是无效的.例如,<input type="text"> </input> 的闭标签是无效 ...