Serverless 函数应用架构升级

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 本次 D2 分享的话题叫 《Serverless 函数应用架构升级》,主要讲述的是阿里集团内部从传统一步步抽离出 midway-faas 框架,并赋予其核心能力,解决用户诉求的一些思考和实践。

点击查看精彩视频

本次 D2 分享的话题叫 《Serverless 函数应用架构升级》,主要讲述的是阿里集团内部从传统一步步抽离出 midway-faas 框架,并赋予其核心能力,解决用户诉求的一些思考和实践。

社区的 Serverless 在不断升温,今年成了阿里经济体前端委员会的四大方向之一,给了前端非常大的机遇和挑战,业务在不断尝试之余,也逐步沉淀出了一套可迭代,可维护,可扩展,可复用的开发模型。如今云厂商不断发力,无声的战争正在打响。

现在,随着 Serverless 的深入人心,云厂商都在说,“我们在定义 Serverless”,而开发者都说”我们在做 Serverless“,用户都是“在用 Serverless",人人都在往 Serverless 体系上靠,或多或少的沾点边,使得整个社区欣欣向荣。

image.png

而对于我们前端本身来说,引进 Serverless,也能在各个场景下带来帮助。目前 Serverless 体系,首选的是 FaaS + BaaS 模型,使用了 FaaS。

首先是更快的开发速度,基于时间驱动模型,能够更方便的进行开发和迭代,让用户快速上线;其次是更加安全的隔离环境,用户再也不能,也不希望登录服务去排查问题;第三是按量付费,由于计费模型的变化,比传统的按实例付费,在访问率低的时候,更能降低成本;最后是弹性实例,在部署服务时,不再考虑峰值等情况,不需要提前预估流量,预先准备实例。

image.png

这些优势,看到了一个新的契机,让前端能够减少开发成本,弱化运维,同时又能更多的关注数据,真正的向着后端、一体化发展,也为跨技术栈研发效能提升提供了可能。

image.png

社区背景

现有的社区,有非常多的云厂商提供函数服务。不管是 Amazon,微软,还是谷歌,以及国内的阿里云和腾讯云,都推出了自己的云函数,同时,每个云厂商都有着一套自己的标准和规范,同时,在这些标准之上,云厂商为了吸引用户,更快的占领市场,做了很多创新,阿里云的 CustomRuntime,以及前段时间腾讯云推出的 Service 2.0 概念,就是比较好的例子。

image.png

作为普通用户,如果想快速的使用 Serverless,在这么多平台面前,光是选择就得斟酌一番,在各个平台之间反复对比,同时,如果想多尝试几个平台,就会发现每个平台的规范,代码行为,启动方式,触发器都不尽相同,对于用户来说,能有跨平台的方案,可以在不同的厂商之间做一些迁移,互调等有意思的尝试。

image.png

在社区中已经有一些能够帮助我们更好的部署到多云的工具链,Serverless Framework 就是其中做的不错的代表,已经有不少云厂商通过开发插件接入了 serverless 工具链。它通过 serverless.yml 文件,定义了多云的能力,使用云厂商开发的插件,一定程度上解决了跨平台的问题。

image.png

这其中没有很好的解决云厂商之前代码层面的不一致(因为是云厂商自己做的),第二,这些插件是云厂商自己提供,如果某些厂商不做支持,那么能力就会缺乏。

image.png

而另一家 ZEIT,推出了 now 系列工具,以轻量简单快速闻名,他们的体验非常棒,目前支持部署到他们接入的平台,示例基本以前端项目为主,和我们 FaaS 本身的实践有所区别,定位也有一些差异。

image.png

在调研完社区的生态之后,我们发现,没有非常契合我们的诉求的产品,我们觉得自己设计一套符合我们定位,且能够满足场景,又面向未来的框架。经过讨论,我们将框架的特性归纳、总结出以下四点:

  • 第一,需要能够防厂商锁定,由于 FaaS 目前没有成熟的标准,导致社区平台割裂,同时因为集团内部也有多套环境的需求,所以我们决定把这个特定放到第一位。
  • 第二,是灵活性,我们称之为 Flexibility,传统的 FaaS 部署模型和计费模型,在某些场景下,成本和性能都有所欠缺,同时,在扩展性、复用性上也不够灵活。
  • 第三,在团队规模越来越大的今天,标准,复用和扩展性已经变的越来越重要,如何解决这些问题,我们也进行了深入思考。
  • 最后,是一些实际的诉求,比如在多个函数之前,复用一些逻辑,统一埋点,监控等,我们需要在这一方面做一些扩展,目前的社区平台无法满足,我们需要设计出一套生命周期,来完善整个体系,这样内外的逻辑保持一致,也可以把我们的实践输出出去。

image.png

防厂商锁定

前面我们提到,不同的云厂商提供的云函数服务,标准不同,写法不同,特别是出入参,会有一些差异,给我们的同学带来了不少困扰。参数这一块这是由不同的运行时决定,像阿里云,就会有 req, res, context 以及 event, context, callback 两种写法,腾讯云和 aws 也有一些异步处理以及参数个数上的差异。

image.png

社区的 Serverless 由于起步比较早,各家云厂商都对它有一定程度的支持,通过 serverless.yml 来定义每个平台的配置、资源、能力,前面也提到,由于是社区化,各家云厂商对插件的支持力度不一,更多的云厂商还是会着重打造自己的 cli 工具链,以及结合自家平台或者 IDE。

我们基于 Serverless Framework 的想法,希望能进一步做标准化和扩展,这样既可以复用社区生态,也可以进一步扩展我们自己的能力。由此,我们的方向分为两部分:

  • 1、进一步标准化 serverless.yml
  • 2、针对不同的云厂商,标准化代码层面的出入参

image.png

severless.yml 的标准化其实比较困难,这一块会参考现有的 serverless 体系,在他们没有做好的地方继续做规范和定义,我们的优势在于,会结合实际场景去考虑,也没有云厂商的包袱,相对来说可以自由一些。

我们设想不同的云平台,都会有类似的能力,比如 http,api gateway,以及 timer,对象存储,消息队列等等,把这些常用的都定义为相同的字段,通过构建来生成出各个平台自己的字段,可以帮用户省下了解的时间。通过这样的变化,我们直接将一份 yml 文件,转变为不同平台自己的 yml 文件,这样缓冲层的设计,也屏蔽了后续因为平台的变化导致用户使用层面的差异性。

image.png

标准化出入参,只是代码上的包裹,相对来说就容易许多。

  • 1、把 callback 变为 Promise(async)
  • 2、把原有的入参做一些抽象,变为一个叫 FaaSContext 的请求上下文(包含了原有 event,context 的部分内容,更像 koa 模型)
  • 3、把原有的 context 变为 FaaSContext 上的属性(保留,后续可能有用)

这样做完之后,针对不同的平台,统一将上下文作为第一个参数传入(必选),event 第二个参数(可选),同时整个方法直接是 async 函数。

image.png

实现层面相对简单,我们把这些内容做成了参数包裹器(parameter wrapper),和之前的 yml 文件一起,结合用户代码的构建产物,分发部署到各个云平台,目前社区我们还只完成了阿里云和腾讯云,这种模型相当轻量,和原有的平台能力也不冲突,后续我们将会继续支持其他平台。

image.png

同时,在这些过程之中,我们采用了 interface 的定义方式,产出了几份针对不同平台的 yml 标准化定义,后续可以用它们快速的格式化,校验,减少用户开发成本。

image.png

下面是我们发布到多平台的演示,展示的是同一份代码文件,在不修改代码本身的情况下,发布到多云。

640.gif

灵活性

我们也把灵活性是灵活性(Flexibility)作为第二个设想的能力,理想情况下,是部署模型的延伸,可以让函数在水平和垂直两个层面自由扩展。

image.png

我们以一个传统 Web 栈作为示例。

传统 Web 应用,路由会写在一个固定的文件中,每个路由一般会关联到一个 Controller 上,在函数的体系下,每个路由都将是一个 http 触发器,都将拆为一个独立的的函数,有着独立的代码、配置等。由于函数的热度不同,调用的频次也会不同。同时,如果原来的路由和 Controller,每个函数可以绑定多个路由。

所以说,FaaS 栈和传统 Web 栈有着很高的相似度,但是不同的是,这些函数都将部署到不同的容器中(隔离性),再加上平台本身宣传的那样,按调用量付费,看起来十分完美。

image.png

殊不知,函数整体的计费模型,除了传统的调用次数,还有一个 CU 的概念,一般来说,CU 会和容器本身的 CPU、内存消耗相关,调用次数容易计算,CU 要优化就比较困难。如果按请求调用量付费,每次调用都启动一个新的实例的话,创建实例本身的开销加上函数调用其实是比较浪费的。

image.png

为此,我们希望在某些场景下,能够尽可能的节省成本。这就产生了一些可能性,如果我们能复用函数实例,并发处理业务,或者共享一些资源,在一定程度上就能降低实例重复创建本身的开销。

我们设想,如果把多个请求在一个实例内处理,创建新实例的次数会变少,如果多个函数的逻辑在一个函数里完成,这样函数冷启动概率是不是就会降低,从而在另一个层面降低成本呢?

如果多个函数在一起,是否可以选择性聚合,假如某个函数请求量变高(热点函数),是否能够随时拆分出来呢?

image.png

这个答案是肯定的,经过实践,我们已经可以做到函数本身的随意组合部署。这就是我们设想的 Flexibility 的一部分,让函数在部署模型上变的更加自由,更加灵活。每个函数可以按传统的部署模型,部署到多个容器中,也可以按照自己的想法(流量情况)聚合到一起部署,随意的组合。

image.png

但是有些同学觉得这样的组合很不错,就会担心成本的问题,毕竟函数的部署模型调整的话,代码也会跟着调整,如果改动复杂的话,这个成本不会接受。

经过我们的设计,我们已经做到了只在 yml (配置)层面做调整,代码层面不需要改动,同时聚合的配置部分不影响原有的函数配置(随意增减),这就是我们 Flexibility 水平聚合能力,我们也叫它 “高密度部署”。

image.png

开发效率

第三点,我们考虑的是开发效率,在团队越来越大之后,开发的标注化,扩展性和可维护性一直是关注的重点,而随着 TypeScript 的推出,越来越多人将应用本身迁移到了这个体系中,我们也在不断思考,但是目前为止,没有在 FaaS 上看到这些方案。

image.png

前面提到过,我们将传统的 Event 和 Context 字段做了转换,同时,因为对代码做了变化,也需要给用户足够多的可用性提示,为此,我们定义一些 interface(比如 FaaSContext)辅助开发。

将 TypeScript 优秀的特性引入 FaaS 体系一直是我们的目标,从 17 年的 pandora 开始,包括去年我们开源的 midway,都全部使用 TypeScript 进行研发,内部的所有库已经全部迁移到了 TypeScript 体系上,让 FaaS 用上 TypeScript 也并不困难。

image.png

为此,我们将 midway 逐步改成了多场景方案,迁移出了名为 midway-faas 的函数框架,在标准的 Class 模型基础上,提供了基于 IoC,装饰器等新的特性,既和原来的体系一脉相承,能力共享,也在 FaaS 场景提供了更多的 Feature。

image.png

运行时扩展

在上面这些特性定义完之后,我们觉得函数的开发本身能力差不多了,但是还有些问题没有解决。

image.png

在使用一段时间之后,我们发现了一些用户诉求。

  • 现有的函数,用户面对的直接是入口参数,我们如果要在跨函数前做一些参数校验,转换的的事情,目前需要做基类继承,或者直接写多次方法调用,这种类 middleware,或者 AOP 的做法,是否能够有方案支持。
  • 内部运行时还好,运行时是由平台掌控,有些有初始化方法,有些没有,那么能不能在一定程度上抹平这些差异,让用户使用无感。
  • 还有一些统一监控,埋点的需求,以及集团内部一直提的治理的需求

image.png

这些能力不一定需要在框架层本身实现,由于我们的构建特性以及隐藏了真实的入口,我们完全可以在整个调用之前加入这些能力。

为此我们设计了一套针对运行时的生命周期,包括 RuntimeStart、FunctionStart、Invoke、Close 四个阶段,以及他们的 before 和 after 的 hook 能力。同时将内部的运行时都基于这套编写,目前已经实现了多个平台的完整运行时。

不过这一套在社区平台稍有不一致,社区的平台基本无法自定义运行时,也就无法执行完整的生命周期,所以我们针对社区平台(例如阿里云 FC),就进行了简化处理。

整个运行时扩展简单来说分为几个部分,最底层的是 runtime-engine,用于整个生命周期的管理和执行。之上的是 LightRuntime,一个轻量的运行时,用于在不同的平台之中完成我们的运行时生命周期,同时适配各个平台的出入参。

image.png

而另一块是每个运行时复用的能力,我们从 Lambda 中借鉴了概念,称之为 Layer。Layer 在设计上可以和任意一个运行时合并,赋予其额外的能力,我们一般用在多场景兼容(传统应用迁移),统一监控、metrics 等能力上。

image.png

经过快一年的迭代更新,我们将淘宝的导购业务迁移到了 Serverless 体系,同时集团其他 BU 也逐步的复制了这套方案,都顺利通过了双促的大考。

640 (1).gif

我们计划将这套 midway-faas 的能力开放给社区,如今,代码已经提交到了 github,还在飞速迭代中,算是 public beta 阶段,我们希望在明年的一月发布 v1.0,提供更多的 Feature 支持。

image.png

Serverless 的路依然还处在起步阶段,不断尝试,降低成本,为前端赋能是我们的目标,也欢迎更多的同学加入到我们的队伍中。

今天我的分享就到这里,感谢大家倾听(阅读),关于 Serverless 的相关问题,欢迎大家微信与我探讨(微信号:czy88840616,备注D2)。


image.png
关注「Alibaba F2E」
把握阿里巴巴前端新动向

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
1月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
1月前
|
机器学习/深度学习 编解码 人工智能
超越Transformer,全面升级!MIT等华人团队发布通用时序TimeMixer++架构,8项任务全面领先
一支由麻省理工学院、香港科技大学(广州)、浙江大学和格里菲斯大学的华人研究团队,开发了名为TimeMixer++的时间序列分析模型。该模型在8项任务中超越现有技术,通过多尺度时间图像转换、双轴注意力机制和多尺度多分辨率混合等技术,实现了性能的显著提升。论文已发布于arXiv。
156 83
|
8天前
|
存储 数据采集 大数据
AllData数据中台技术架构升级演进
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
15天前
|
SQL 存储 缓存
EMR Serverless StarRocks 全面升级:重新定义实时湖仓分析
本文介绍了EMR Serverless StarRocks的发展路径及其架构演进。首先回顾了Serverless Spark在EMR中的发展,并指出2021年9月StarRocks开源后,OLAP引擎迅速向其靠拢。随后,EMR引入StarRocks并推出全托管产品,至2023年8月商业化,已有500家客户使用,覆盖20多个行业。 文章重点阐述了EMR Serverless StarRocks 1.0的存算一体架构,包括健康诊断、SQL调优和物化视图等核心功能。接着分析了存算一体架构的挑战,如湖访问不优雅、资源隔离不足及冷热数据分层困难等。
|
12天前
|
容灾 网络协议 数据库
云卓越架构:云上网络稳定性建设和应用稳定性治理最佳实践
本文介绍了云上网络稳定性体系建设的关键内容,包括面向失败的架构设计、可观测性与应急恢复、客户案例及阿里巴巴的核心电商架构演进。首先强调了网络稳定性的挑战及其应对策略,如责任共担模型和冗余设计。接着详细探讨了多可用区部署、弹性架构规划及跨地域容灾设计的最佳实践,特别是阿里云的产品和技术如何助力实现高可用性和快速故障恢复。最后通过具体案例展示了秒级故障转移的效果,以及同城多活架构下的实际应用。这些措施共同确保了业务在面对网络故障时的持续稳定运行。
|
9天前
|
存储 人工智能 Serverless
7分钟玩转 AI 应用,函数计算一键部署 AI 生图大模型
人工智能生成图像(AI 生图)的领域中,Stable Diffusion WebUI 以其强大的算法和稳定的输出质量而闻名。它能够快速地从文本描述中生成高质量的图像,为用户提供了一个直观且高效的创作平台。而 ComfyUI 则以其用户友好的界面和高度定制化的选项所受到欢迎。ComfyUI 的灵活性和直观性使得即使是没有技术背景的用户也能轻松上手。本次技术解决方案通过函数计算一键部署热门 AI 生图大模型,凭借其按量付费、卓越弹性、快速交付能力的特点,完美实现低成本,免运维。
|
15天前
|
SQL 存储 分布式计算
Paimon助力数据湖仓架构实时化升级
本次分享由阿里云高级技术专家李劲松介绍Paimon助力数据湖仓架构实时化升级。内容涵盖四个部分:1) 数据架构的存储演进,介绍Data LakeHouse结合的优势;2) Paimon实时数据湖,强调其批流一体和高效处理能力;3) 数据湖的实时流式处理,展示Paimon在时效性提升上的应用;4) 数据湖非结构化处理,介绍Paimon对非结构化数据的支持及AI集成。Paimon通过优化存储格式和引入LSM技术,实现了更高效的实时数据处理和查询性能,广泛应用于阿里巴巴内部及各大公司,未来将进一步支持AI相关功能。
|
26天前
|
人工智能 Serverless API
尽享红利,Serverless构建企业AI应用方案与实践
本次课程由阿里云云原生架构师计缘分享,主题为“尽享红利,Serverless构建企业AI应用方案与实践”。课程分为四个部分:1) Serverless技术价值,介绍其发展趋势及优势;2) Serverless函数计算与AI的结合,探讨两者融合的应用场景;3) Serverless函数计算AIGC应用方案,展示具体的技术实现和客户案例;4) 业务初期如何降低使用门槛,提供新用户权益和免费资源。通过这些内容,帮助企业和开发者快速构建高效、低成本的AI应用。
71 12
|
2月前
|
Cloud Native 安全 持续交付
深入理解微服务架构及其在现代软件开发中的应用
深入理解微服务架构及其在现代软件开发中的应用
90 32
|
1月前
|
弹性计算 运维 Serverless
卓越效能,极简运维,体验Serverless高可用架构,完成任务可领取转轮日历!
卓越效能,极简运维,体验Serverless高可用架构,完成任务可领取转轮日历!

相关产品

  • 函数计算