Serverless在编程教育中的实践( 二 )


【Serverless在编程教育中的实践】成本控制粒度粗
再次是整个IaaS资源的成本控制 , 我们都知道这种在线教育是有明显的流量潮汐的 , 比如上午10点到12点 , 下午3点到5点 , 晚上8点到10点这几个时段是流量比较大的时候 , 其他时间端流量比较小 , 而且夜晚更是没什么流量 。 所以在这种情况下 , 传统的部署架构无法做到IaaS资源和流量的贴合 。 举个例子 , 加入为了应对流量高峰时期 , 需要20台ECS搭建集群来承载流量冲击 , 此时每台ECS的资源使用率可能在70%以上 , 利用率较高 , 但是在流量小的时候和夜晚 , 每台ECS的资源使用率可能就是百分之十几甚至更低 , 这就是一种资源浪费 。
Serverless架构
那么我们来看看如何使用Serverless架构来实现同样的功能 , 并且解决上述几个问题 。 在选择Serverless产品时 , 在国内自然而然优先想到的就是阿里云的产品 。 阿里云有两款Serverless架构的产品Serverless 应用引擎和函数计算 , 这里我们使用函数计算来实现编程教育的场景 。 函数计算(Function Compute)是事件驱动的全托管计算服务 , 简称FC 。 使用函数计算 , 我们无需采购与管理服务器等基础设施 , 只需编写并上传代码 。 函数计算为您准备好计算资源 , 弹性地、可靠地运行任务 , 并提供日志查询、性能监控和报警等功能 。
这里不对FC的含义做过多赘述 , 只举一个例子 。 FC中有两个概念 , 一个是服务 , 一个是函数 。 一个服务包含多个函数:
Serverless在编程教育中的实践文章插图
这里拿Java微服务架构来对应 , 可以理解为 , FC中的服务是Java中的一个类 , FC中的函数是Java类中的一个方法:
Serverless在编程教育中的实践文章插图
但是Java类中的方法固然只能是Java代码 , 而FC中的函数可以设置不同语言的Runtime来运行不同的编程语言:
Serverless在编程教育中的实践文章插图
这个结构理解清楚之后 , 我们来看看如何调用FC的函数 , 这里会引出一个触发器的概念 。 我们最常使用的HTTP请求协议其实就是一种类型的触发器 , 在FC里称为HTTP触发器 , 除了HTTP触发器以外 , 还提供了OSS(对象存储)触发器、SLS(日志服务)触发器、定时触发器、MNS触发器、CDN触发器等 。
Serverless在编程教育中的实践文章插图
从上图可以大概理解 , 我们可以通过多种途径调用FC中的函数 。 举例两个场景 , 比如每当我在指定的OSS Bucket的某个目录下上传一张图片后 , 就可以触发FC中的函数 , 函数的逻辑是将刚刚上传的图片下载下来 , 然后对图片做处理 , 然后再上传回OSS 。 再比如向MNS的某个队列发送一条消息 , 然后触发FC中的函数来处理针对这条消息的逻辑 。
最后我们再来看看FC的高可用 。 每一个函数在运行代码时底层肯定还是IaaS资源 , 但我们只需要给每个函数设置运行代码时需要的内存数即可 , 最小128M , 最大3G , 对使用者而言 , 不需要考虑多少核数 , 也不需要知道代码运行在什么样的服务器上 , 不需要关心启动了多少个函数实例 , 也不需要关心弹性扩缩的问题等 , 这些都由FC来处理 。
Serverless在编程教育中的实践文章插图
从上图可以看到 , 高可用有两种策略:
给函数设置并发实例数 , 假如设置为3 , 那么有三个请求进来时 , 该函数只启一个实例 , 但是会启三个线程来运行逻辑 。
线程数达到上限后 , 会再拉起一个函数实例 。
大家看到这里 , 可能已经大概对基于FC实现在线编程教育系统的架构有了一个大概的轮廓 。
Serverless在编程教育中的实践文章插图
上图是基于FC实现的在线编程教育系统的架构图 , 在这个架构下来看看上述那三个核心问题怎么解:
工作量和灵活性:我们只需要关注在如何执行代码的业务逻辑上 , 如果要加新语言 , 只需要创建一个对应语言Runtime的FC函数即可 。 高可用:多线程运行业务逻辑和多实例运行业务逻辑两层高可用保障 , 并且函数实例的扩缩完全都是FC自动处理 , 不需要研发和运维同学做任何配置 。 成本优化:当没有请求的时候 , 函数实例是不会被拉起的 , 此时也不会计费 , 所以在流量低谷期或者夜间时 , 整个FC的成本消耗是非常低的 。 可以做到函数实例个数、计费粒度和流量完美的贴合 。