大家都关注的Serverless,阿里怎么做的?


作者|陈仲寅(张挺)
出品|阿里巴巴新零售淘系技术部

本文是阿里巴巴前端技术专家-张挺,在 JSConf China 「中国开发者大会」上分享的《面向传统,Serverless 进化之路》,主要讲述阿里集团内部逐步迁移到 Serverless 体系的过程以及思考。

背景

自 GMTC 以来,国内各个公司在 Serverless 投入都有所变化,腾讯和阿里云都铆足了劲在上面发力,提出了各自的解决方案,腾讯推出了 Serverless 2.0,以及几天前阿里云推出的预留模式,都是对 Serverless 越来越重视的表现。

本文主要介绍两部分,第一是阿里在近期做的前端研发升级,为拓展前端的边界和职能,尝试做了一次和 Serverless 结合,第二是在这其中,我们尝试对现有的体系做了思考,希望能将传统应用快速迁移到 Serverless 体系,享受到 Serverless 红利。

现状

阿里的 Node.js 应用非常多,1600+ 的数量让维护和治理都变的很麻烦,每一次升级都要推行很久,这不管对框架开发还是平台治理都是不利的。

很多 Node.js 应用都是 BFF 应用,内部平台等,这些应用常年大多都处在负载低(10%以下),没有流量的状态,而且维护者大多处在离职或者不积极的状态,一方面造成了资源浪费,另一方面也给治理造成了困难。

其次,在集团开发传统应用,需要申请,整个研发流程比较长,需要业务了解预算和资源,牵扯到很多细节。

为此,我们开始了 前端研发升级 这个大项目。

整个前端研发模式升级的目的有两个,一是为了“前端赋能”,二是为了“前端提效”。

所谓的“前端赋能”,是因为我们希望前端能够打破现有的技术壁垒,朝着更底层,面向数据的地方去深入探索,在这之中可以从面向 UI,视图本身变的更加了解业务,从更面全面的视角来理解现有的体系。

而“前端提效”,则是希望让 Serverless,用更轻量化的方式进行业务研发,降低整个前端参与业务交付的门槛,同时,在开发期间,也能减少人力总成本,让前端减负,业务小步快跑成为可能。

但是阿里的 Serverless 之路非常困难,不像外界已经有成熟的体系,目前一些原因无法使用公有云上开放的产品,阿里云也无法直接对内部提供服务,同时,内部的中间件在外部都没有,都需要跨团队来重新建设。

Node.js 基础团队的使命,就是为集团 Node.js 生态提供各种基础能力,包括但不限于框架,中间件包等,而在 Serverless 体系中,我们要负责框架、工具链、运行时、发布系统,同时也需要和周边的网关,监控系统等对接。

收益

去年 10 月开始,我们开始进行调研 Serverless 以及了解相关知识,到现在为止,也已经取得了一定的阶段性成果,将淘宝和飞猪两道 BU 的导购链路整个迁移到了 Serverless 体系,并且承载了导购链路的千万级流量。

同时,内部系统也进行了一定程度的 Serverless 升级尝试,不管是重写还是传统应用迁移,我们都有了一定的沉淀。

我们最初的目的是希望能降低成本,按照网上 Serverless 的降低成本率能达到 90% 以上,不过导购业务比较特殊,流量比较大,不像那些需要弹性的应用,根据我们的测算,单进程下函数的性能非常不错,但是由于大促要提前预留一些资源,整体机器成本只降低到了平时的 70%,而在非大促期间,不需要预留这些资源,就能更低,降到 40% 以下。

现在都说 DevOPS,而 Serverless 最大的好处是减少运维,减少固定服务器资源,不需要用户关心调度等,同时也简化了开发的代码,专注了逻辑,晚上睡觉会更加的放心,不再担心机器容量不足而报警。

另一边,对于我们应用治理的人来说,之前会考虑各种版本碎片化的问题,node 的多版本,框架的多版本,以及启动脚本、依赖等等问题,而使用 Serverless
之后,我们将这些都固化了,用户也不关心这些,一切都变的简单了,我们也只需要治理运行时一个版本即可。

在业务前端方面,带来的是挑战和机遇,一方面,前端的工作量增大了,能干的事情也变多了,成了一职多能的多面手,也更了解业务了,另一方面,传统的后端可以从和前端沟通中解放出来,更专注于提供服务。前端从传统的面向接口编程变成了面向服务编程,由于集团内都是 RPC 服务,在 RPC 发布时会有固定的定义和文档,在调用时有工具辅助生产代码,大大简化了调用链路。

在流程方面,原来需要在各个环境准备和调研,从一开始申请应用,申请预算,申请环境开始,需要了解各个方面的知识,和不同部门的人打交道,流程审批也很长,而现在只需要在我们的统一研发平台上直接申请函数组,替代了原本的复杂流程,也提升了整个开发体验。

同时在编码中也不再考虑路由,MVC 的事情,这些在网关层配置就好,编写代码时会更关注逻辑,和之前的构建发布不同的是,现在增加了云端集成测试的步骤,由于函数和前端代码一样,是分版本的,也不担心修改到线上的正常服务,在测试完毕后,只需要将旧函数的 tag 指向新函数即可,这就完成了整个切流的过程,而一旦碰到问题,把 tag 切回去就行。

这就是我们前端研发模式升级的思考和收益,带给我们的不仅仅是变化,更多的是流程、思维的革新。

思考

在研发模式升级过程中,我们针对现有的导购业务进行了重构,可以说是使用了 Serverless 的方式进行了重写,而有一些老的应用,如果整体进行改造,这个成本会非常之大。

这个时候开发者就会有很常见的一个疑问:我原来的应用,怎么迁移到 Serverless 体系?

而我们的回答是两种:

  • 使用 FaaS + Baas 的方式进行重构,代码更精简,就是需要改造成本
  • 把整个传统应用作为一个函数,虽然不够优雅,但是能解决迁移的问题

把整个应用迁移到函数会有一些限制,会对代码结构和模型做一些微调,以符合整个 Serverless 的结构,毕竟新的体系和传统的代码模型是有所区别的。

阿里集团采用的是 FaaS + BaaS 的实现方式,而 FaaS 的整体概念和传统的应用不太一样。

在概念上,Serverless 比 FaaS 的外延要广,FaaS 属于 Serverless 的其中一种实现方式,主要解决的是用户自定义的代码逻辑如何做到 Serverless,也可以叫做 Serverless Compute,同时它也是事件驱动架构的一种。

而 CNCF Serverless 白皮书中也说到,Serverless Compute 是一种粒度更细的部署模型,通过一个或者多个 function,用于响应用户的需求。可以说,粒度小,灵活性高是它的最大特性。

在代码层面,为了让用户更好的理解,我们把传统代码的结构进行了分解,传统的 MVC 类型的代码,会分为几层。

  • HTTP 服务,原框架(koa/midway/egg…),Node.js 运行时,启动脚本等,将会变为函数运行时,固化下来
  • 原有的 HTTP Router,Web 中间件等,将会由 HTTP 网关承接
  • 原有的 Controller,业务逻辑(调用远程服务),继续保留,变为函数代码
  • 原有的数据库,消息队列,RPC 调用等,都作为 BaaS 服务,用户只关心对应的服务,使用同一的 BaaS Client 进行调用

这样分解过后,我们对新旧两个体系的代码结构有了进一步认识,可以开始尝试修改部分代码,变成真正的 Serverless。

迁移

传统的应用,会暴露出一些对外的服务供外部调用,比如 HTTP,定时任务,RPC 服务等等,这些服务一般我们会单独抽离目录,并且和其他暴露的服务共享逻辑层代码,我们也经常称这些服务为“入口”。

在 Serverless(FaaS) 化的过程中,我们会根据当前部署平台的能力(比如阿里云 FC,腾讯 SCF 都会提供 HTTP 服务,定时任务,消息队列等等),将这些入口代码变为基于事件驱动的函数。

我们通过构建机制,在发布时生成不同的包,在共享一份逻辑代码的同时,部署到不同的环境,这个方案最大的优势是复用了原有的逻辑部分,可以和传统应用同步开发,而劣势也有,就是包依赖混在一起,由于函数对包大小有限制,可能会造成依赖过大等问题。

HTTP 相对于其他的来说会复杂很多,会有很多限制,这个我们在讲下游方案的时候再说。

针对上面的情况,对下游的数据调用我们也有相应的方案。我们将这些方案取了几个名字,比如代理模式和网关模式。

▐ 代理模式

首先来看看代理模式。一个传统的 Web 应用会分为 Router/Controller,以及逻辑层,在代理模式中,我们会保留传统的应用,只将原本的逻辑层部分迁移到了云函数中,暴露出 HTTP 服务。

这样的好处是代码变的精简,改动适中,也易于服务复用,缺点就是依旧会占用一个应用资源作为代理层。

而代理应用一般是通过 HTTP 客户端代理来实现的只是用户体感上需要做一些额外的支持,让开发者在体验上感觉到是调用了远端服务。

▐ 网关模式

第二种方式是网关模式,这个模式下,所有的代码都会迁移到新的体系,在 Web 层简单的时候比较适用。

该模式下,所有传统的 Web Router 会迁移到 HTTP Gateway 上,原本的路由,会话、鉴权等能力都将被网关所控制,而函数本身不需要关心这些,只需要关心数据即可。

业界现有的 FaaS 模型大多是这种结构,集团内也采用了这类结构去实践。

在这种模式下,原有的能力会碰到一些问题,举一些例子:

  • 原有的 Web 中间件(koa middlware),会不知道如何处理,中间件大多是做请求流的拦截和消费,这个时候大多会拆成两部分,一部分被网关所处理,另一部分,只能交给函数本身,如果有共享的需求,也可以依赖模块来完成
  • 原有的会话维持,一部分平台会进行透传 cookie,这个时候你依旧可以维持一个 sessionId,同时使用第三方来存储数据,但是如果网关不做这块,那么就很麻烦了
  • 请求对象和原有的不同,由于函数获取的是 event,context 参数,或者原始的 request 对象,和现有的 koa 等框架不是很一致,上面的方法不一定有,会导致原有的代码做出修改和挑战

▐ 伪装者模式

那么有没有不修改代码的方案呢?我们尝试在函数外部进行代码包裹和数据模拟,让应用整个跑在函数之上,以一种 “微应用” 的方式继续存在。

我们把原有的 Web Server(midway/egg),启动起来,在运行时中通过一个固定的端口转发,把 FaaS 的请求参数包裹成 HTTP Request 对象,而在出口处,也将 HTTP Response 包裹为函数能读懂的形式,通过这样续命的方式来延续传统应用。而由于阿里云上的容器只读不能写,目前还无法直接用这种模式。

这种方式需要调整的是,框架需要使用单进程模型(机器配置,轻量化的要求),应用需要无状态(函数机制决定),以及没有长连接等高消耗的操作。

总结

关于 Serverless 的问题还有很多,本文也只是介绍了其中一部分内容,从阿里当前的状况讲起,分享了从去年到今年的研发模式升级实践,也介绍了在这其中我们的一些思考,传统应用迁移到 FaaS 体系下的方式。后续的整套方案也会在经过双十一的洗礼,大流量的考验后,开放给大家。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的第一个Go程序

夫陶公清风千古,余又何人,敢称庶几 文章目录介绍技术网站入门程序介绍 💡官网介绍 Go 是一门开放源代码的编程语言,可轻松构建简单,可靠且高效的软件。 💡百度百科 Go(又称 Golang)…

2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

“不是任何一朵云都能撑住这个流量。中国有两朵云,一朵是阿里云,一朵叫其他云。”11月11日晚,阿里巴巴集团CTO张建锋表示,“阿里云不一样,10年前我们从第一行代码写起,构建了中国唯一自研的云操作系统飞天。…

阿里CTO张建锋:明年双11将大规模应用含光AI芯片

11月11日晚,阿里巴巴集团CTO张建锋宣布重磅消息,明年双11将大规模应用平头哥自研的含光AI芯片。 达摩院研发的AI技术已应用于天猫双11的各个场景。未来,这些人工智能应用将会越来越多跑在阿里自研的芯片上。 2019年9月25日杭州云栖大会上&am…

shell脚本报错“^M: bad interpreter”解决方法

文章目录1. 现象2. 先编辑脚本3. 脚本观察4. 脚本格式调整5. 脚本格式查看6. 保存脚本7. 重新运行脚本1. 现象 bash: ./ry.sh: /bin/sh^M: bad interpreter: No such file or directory2. 先编辑脚本 # 首先编辑脚本 [rootnode2 ruoyi]# vim ry.sh# 3. 脚本观察 这时会看到文…

深入解析final关键字的用法

夫陶公清风千古,余又何人,敢称庶几 个人博客地址:http://blog.breez.work 文章目录介绍解析final属性final方法final参数final类介绍 final用于声明属性【属性不可变】、方法【方法不可覆盖】、类(除了抽象类)【类不…

出道50年+!乘风破浪的编程语言们,能二次翻红吗?

来源 | 编程技术宇宙责编| Carol继上次哈希表华山论剑之后,比特宇宙编程语言联合委员会又来搞事情了。委员会要做一套全新的系统,涉及后端、前端、客户端三大块,为选择什么样的语言组合拿不定主意。为了体现公平,委员会特举办一次…

Spotify如何使用Cassandra实现个性化推荐

在Spotify我们有超过6000万的活跃用户,他们可以访问超过3000万首歌曲的庞大曲库。用户可以关注成千上万的艺术家和上百个好友,并创建自己的音乐图表。在我们的广告平台上,用户还可以通过体验各种音乐宣传活动(专辑发行&#xff0c…

RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 多机版本)

接上一篇:RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包nginx 单机版本) 前端和后端不在一个服务器上,如何部署呢? 文章目录1. 服务器和软件部署2. 后端部署3. 前端部署4. 登录5. 效果图1. 服务器和软件部署 服…

三个不同线程顺序打印ABC十种写法【并发编程JUC】

夫陶公清风千古,余又何人,敢称庶几 个人博客地址:http://www.breez.work 📖写法一:使用信号量Semaphore public class Foo {private Semaphore semaphoreB new Semaphore(0);private Semaphore semaphoreC new Sem…

技术直播:数据科学到底该怎么“玩”?

90年代初,王健林抓住的房地产的机遇,现在才敢说“一个亿的小目标”;千禧年后 ,“马爸爸”抓住了电商的机遇,现在才能说“我对钱没有兴趣”。今年由于特殊情况,加速了远程办公、在线教育和在线医疗的发展&am…

Apache Flink 为什么能够成为新一代大数据计算引擎?

众所周知,Apache Flink(以下简称 Flink)最早诞生于欧洲,2014 年由其创始团队捐赠给 Apache 基金会。如同其他诞生之初的项目,它新鲜,它开源,它适应了快速转的世界中更重视的速度与灵活性。 大数…

超燃!支付宝技术双11纪录片《一心一役》全球独家首发

​和过去10年一样,2019年天猫双11又创造了一个全新的纪录。 这个数字背后,是数代支付宝工程师们殚精竭虑、不断突破技术难关。 今年双11之前,小编邀请到11位经历双11的技术同学口述实录,特别筹备了纪录片《一心一役》&#xff0c…

RabbitMQ消息队列简单异步邮件发送和订单异步处理实战【应用解耦】【异步削峰】

介绍 📖源码地址: https://gitee.com/breez/mq-shop 介绍 使用RabbitMQ消息队列异步发送短信和邮件、订单异步处理【流量削峰】 软件架构 技术栈 序号名称1SpringBoot2SpringMVC3Mybatis plus4RabbitMQ5SpringBoot Mail 特点: 邮件发送的封装三大发…

秋名山老司机从上车到翻车的悲痛经历,带你深刻了解什么是 Spark on Hive!| 原力计划...

作者 | Alice菌责编 | 夕颜出品 | CSDN博客本篇博客将为大家分享的内容是如何实现Spark on Hive,即让Hive只作为存储角色,Spark负责sql解析优化,执行…话不多说,直接上车!上车前需知Spark on hive 与 hive on spark 的…

从电商到软件市场,阿里双11战火蔓延

2019年“双十一”,是阿里天猫奋战的第11个年头,更是阿里在电商行业的一个重要的里程碑。今年,整个阿里系也在“一心一役”全面出击,作为阿里旗下的重要大将——阿里云也加入了这场购物狂欢,将火热的购物氛围从C端消费者…

RuoYi-Cloud 部署篇_01(linux环境 mysql+nginx版本)

文章目录一、基础准备1. 技术选型2. 源码克隆3. 安装依赖4. 将 RuoYi-Cloud 项目导入到 IDEA5. 安装启动Mysql6. 安装启动Redis7. 创建数据库,执行 SQL脚本文件二、安装与配置 nacos2.1. 下载nacos2.2. 安装 nacos2.3. nacos持久化配置2.4. 执行脚本文件2.5. nacos连…

SpringBoot集成Elasticsearch实现博客高亮搜索

文章目录效果展示二、使用步骤1.引入maven依赖2. 编写spplication.properties3.配置客户端4.高亮搜索5.转换成实体对象总结效果展示 虽然看起来巴适,但是挺简单的! 📝 英文检索 📝 中文单字检索 二、使用步骤 1.引入maven依赖…

淘系技术,实力为2019年双11而战!稳!

2019 天猫双 11 全球狂欢节96秒成交额破百亿,24小时总成交额2684亿,创造了交易创建峰值 54.4万笔/秒的历史记录。天猫双11,已经不仅是购物节,也是品牌成长节、消费者互动节。天猫双11更是是商业的奥林匹克。 今年&…

上班从不迟到,生病不敢请假,加班唯命是从,明明已经很拼命了,为什么还是缺钱?...

为了省几百块钱房租,每天在路上多花两三个小时;为了少花几毛钱,买包纸巾也要货比三家;被上司大声指责,为了保住饭碗,只能陪着笑脸......上班从不迟到,生病不敢请假,加班唯命是从&…

RuoYi-Cloud 部署篇_02(linux环境 mysql+nginx版本)

文章目录一、模块配置修改1. ruoyi-gateway-dev.yml2. ruoyi-auth-dev.yml3. ruoyi-system-dev.yml4. ruoyi-gen-dev.yml5. ruoyi-job-dev.yml6. ruoyi-file-dev.yml二、后端配置预启动2.1. 部署资料整合2.2. 模块端口划分2.3. 组件端口划分2.4. 服务脚本编写2.5. 前端编译生产…