作者 | 朱志国、汪智群、赵涵、戴文龙等,来自平台业务研发部-应用业务产品研发部通天塔团队。
写在前面
Serverless是目前比较热门的技术话题,各大云平台以及互联网大厂内部都在积极建设Serverless产品。本文将介绍iPaaS(京东前端一体化搭建平台)体系下的 Serverless FaaS产品EasyFunction平台的功能和落地情况,具体分为两个部分,第一部分通过介绍FaaS适用的场景、可带来的收益来说明我们为什么要做EasyFunction以及它可以给我们带来哪些收益,第二部分通过EasyFunction的产品功能、典型落地案例的介绍来深入了解EasyFunction。通过阅读希望可以给大家带来一些启发和帮助。
背景
近些年Serverless技术迅速发展,国内各大互联网公司都在积极建设Serverless相关产品,探索Serverless技术的落地,国内阿里云、腾讯云等都有相应商业化的产品。在这种大的背景下,通天塔团队结合自身的需求和支撑IPaaS技术开放体系需要,在去年9月份经过调研后,开始了Serverless FaaS平台的建设,内部项目名称为EasyFunction。用一句话概括EasyFunction即一种基于 Java、NodeJs、Go等多语言功能函数即服务 (FaaS) 的编程平台,帮助用户脱离繁冗的开发配置、申请机器资源等运维工作,开发者只需要关注业务代码逻辑的编写实现。目前我们处于快速验证,落地MVP版本阶段,我们通过技术选型、产品与架构设计、开发迭代,已经快速落地了Serverless FaaS产品的基本的能力,如构建、发布、弹性伸缩、对接触发源、执行函数等。目前正在推进了一些业务的试点接入,帮助验证打磨产品。
适用场景
01BFF(Backend For Front)场景
BFF层,主要职责把相对底层的领域对象数据通过聚合、裁剪转换成前端视图层的数据,这里的视图层数据会因端上的场景和设备而异,经常要做一些个性化处理。而对于视图层数据模型前端开发最为清楚和熟悉,知道需要什么样的数据来渲染页面。在传统的开发模式中会导致后端相似功能的聚合接口林立,而且大部分接口生命周期都很短(业务试错原因),开发阶段前后端沟通成本、后期维护成本、机器资源成本都比较大。而使用FaaS支持多种语言的函数开发,降低开发门槛,开发者在编写函数时只需关注业务逻辑的实现,就可以完成API编写、发布、上线,这样一来前端同学就可以实现数据层的自管理,减少前后端沟通成本。
02数据处理&定时任务场景
FaaS平台直接与任务调度系统、JMQ打通,开发者只需关注任务的处理逻辑编写,然后创建相应类型的函数触发器,就可以完成定时任务的接入,而不需要管理机器资源,同时可以根据实时流量或者实例CPU负载进行资源的自动伸缩,资源按需使用。
03SSR(服务端渲染)场景
在服务端完成数据和样式的绑定,返回html数据,这种比较耗后端资源,但好处是页面可以快速展现,所以这块可以尝试在FaaS中写,尤其前端首屏快速展现场景。
04后台管理平台场景
公司内部有很多的后台管理平台的Web服务,它们虽然相较于函数是比较重的,但完全可以直接托管Serverless平台,充分享受Serverless平台极致的发布和运维效率。
带来的业务收益
将传统应用和FaaS云函数进行个简单地对比:
- "统一" 了业务组间的业务实现方式,业务切换快
- 消除服务端技术壁垒,可以使用熟悉的技术栈做业务逻辑开发
- 对用户 ”无框架“ 概念,用户只需要了解函数的输入和输出
- 从部署、发布、监控 “一条龙” 式的平台服务,高效、稳定
不管是在资源利用率还是研发运维效率上,FaaS都给我们带来了诸多好处。
产品功能
EasyFunction-云函数底层k8s运维、机器资源编排托管于京东云,而我们则专注于FaaS产品上层功能的建设,比如网关功能建设、一站式平台开发、函数模板开发等,目前已经快速落地了Serverless FaaS产品的基本的能力,如构建、发布、弹性伸缩、对接触发源、执行函数,具体功能如下:
01函数创建
EasyFunction支持Java8、NodeJs14、Go、Python、PHP、Ruby六种语言的函数创建,其中Java8语言的函数生态最为丰富,集成了集团主流中间件(JSF、Ducc、JMQ、ClickHouse、UMP等),其次是NodeJs,如果大家感兴趣加入我们一起共建函数语言模板,丰富函数生态。
开发者选择好语言完成创建函数,下载对应函数模板代码,上传到Coding,在函数基本配置信息中配置函数仓库地址、选择函数实例CPU、内存配置、配置环境变量即完成函数创建。
02版本&路由
在完成函数创建后,进入函数代码编写、测试、发布版本阶段。具体语言的函数代码编写指南参照开发手册文档同时在开发工具上EasyFunction集成了CloudIDE,轻松实现WEB端编码。我们也提供了在线函数测试功能。
经过部署、测试后,可对当前LATEST版本进行发版,发布一个新的版本可以理解为为 LATEST 版本的函数代码和函数配置(不包括触发器)创建一个快照副本。针对发布的版本开发者可以实时查看日志、重启、调整副本实例。
在首次完成版本发布后,建议开发者创建对应的别名,使用别名访问服务或函数时,EasyFunction会将别名解析为其指向的版本,调用方无需了解别名指向的具体版本,同时开发者可自由的调整别名下所管理版本的流量比例。
03触发器
触发器是触发函数执行的方式。在事件驱动的计算模型中,事件源是事件的生产者,函数是事件的处理者,只有创建了对应的触发器,外部事件才可以通过触发器的具体方式访问到函数。EasyFunction支持HTTP、Color网关、JMQ三种类型的触发器,其中HTTP在公司内网系统间调用使用、Color网关用于外网事件源触发函数。
04自动伸缩
EasyFunction目前支持根据CPU负载和单实例QPS两种类型的指标触发伸缩,在高流量场景下单一指标的短暂性抖动会导致伸缩频繁不稳定的问题,后续我们将基于多负载指标+算法预测作为触发伸缩的依据同时增加定时伸缩功能。不过当前的单一指标伸缩在一些流量稳定且有一定规律的场景下预期也是比较好。下图是线上一个函数的案例函数实例数基本上随着QPS的增长而伸缩,在凌晨4点时刻由于流量达到最低,实例副本数也降到最低2个。
模拟数据
05日志&监控
EasyFunction提供了在线函数日志检索和函数一些基本指标的监控。
落地案例
在完成MVP版本的上线后,目前已经推进了一些业务的接入,下面介绍几个典型案例。
1、水滴cms和EasyFunction结合,帮助开发者快速高效的搭建cms
水滴cms搭建平台负责页面的样式的搭建和数据渲染、FaaS提供cms所需的数据,这个数据开发者可自行通过创建函数、编写函数来定义,且EasyFunction支持多语言,免运维的特点,降低开发者开发门槛的同时让开发者只需要关注业务逻辑的实现即可快速发布一个函数为cms提供自定义的数据。
2、营销中心资源位接口案例(BFF场景)
提供在线的,以 API 为管理维度的聚合类 API是典型的BFF场景。营销中心系统的宗旨之一是打造中心化工作平台,整合内部垂直平台能力,所以经常需要编排处理多个外部平台的接口数据,然后返回符合营销中心cms前端样式要求的数据。此种场景下开发者通过在函数中编排已有其他平台的JSF或者HTTP类型的接口,快速构建发布函数,而不需要考虑机器资源申请、域名申请等运维问题。
3、通天塔日志分析函数(数据处理场景)
通天塔核心系统日志MQ流量会随着业务请求流量的上升而上升,之前是在后端管理平台上处理日志分析的逻辑,经常会遇到流量高峰时日志处理吞吐量不足进而导致监控大盘显示延迟的问题,老的办法只能通过提前预估流量手动扩容后端管理应用的实例来应对。而使用函数来处理,创建JMQ类型的函数触发器,配置合适的自动伸缩策略就可以很好的解决以上问题。
未来规划
接下来我们将会从优化核心技术,保障业务稳定性;完善生态,落实收益方向上去推进。实践方向上我们会针对前面说的4大适用场景上去落地案例,真正做到降本增效。下一期我们将会详细介绍EasyFunction底层架构设计和核心技术原理。