如何落地一个FaaS平台?

 

简介: 函数即服务(FaaS)作为云计算 2.0 时代重要的发展方向,能够从工程效率、可靠性、性能、成本等方面给开发者带来巨大的价值,尤其是能够极大地提升研发效率。因此,拥抱FaaS成为开发者关心的重要技术领域。阿里文娱技术专家墨洵、研发工程师武升将介绍文娱函数计算平台的设计思想与关键技术难点,并结合业务介绍函数计算的落地实践经验。

image.png

一 背景

优酷内容分发业务涵盖了优酷主客的首页、频道页、二级页等不同场景下的内容分发,服务端之前采用传统的Java应用结合阿里集团中间件的开发模式,一直是产品评审、API设计、前后端联调、前后端发版等节奏。然而,随着端上内容的多样化,产品需求迭代的加速,传统的服务端架构开发模式已显得力不从心,我们虽然沉淀出一套通用框架,但受限于开发模式的本质并没有变化,业务开发的灵活性与开发成本依然很高。总结起来,面临的挑战主要是:API依赖数据源多,业务需求变化快,前后端联调成本大等。

二 平台设计与技术难点

1 设计目标

希望实现一个通用的函数计算平台,在这个平台上,开发者直接通过编写、运行和管理一个或多个函数对外提供服务,允许通过微服务、HTTP接口、事件源触发等多种方式调用函数。同时,函数的开发及发布应该是秒级生效,且无需重启宿主应用的.

FaaS平台应该提供函数式应用的运行环境,应该支持轻量级脚本语言编写函数。我们首选Groovy语言,主要是考虑了Groovy的代码简洁,同时可以访问Java的原生的类和对象。

FaaS可以根据实际的访问情况进行函数实例的动态加载和资源分配。

总结起来,在FaaS平台上运行的函数应该是一个短小、离散、可复用的代码块,我们希望它有以下几个特点:

  • 生命周期短,支持快速发布部署
  • 非守护进程(不需要长时间运行,按需加载)
  • 不提供长连接服务
  • 无状态
  • 可重用现有服务或第三方资源(重点,FaaS应该建立在完善的基础服务上)
  • 毫秒级执行时间
2 平台整体设计

FaaS平台的整体核心架构主要由网关、运行时容器、一站式运维发布平台、基础服务等组成:

image.png

网关层主要负责接受函数调用请求,通过函数的唯一标识及函数的集群信息分发函数调用到对应集群的机器环境中执行。

函数容器层是整个系统的核心,主要通过函数执行引擎进行实例的调用执行,同时负责函数实例的生命周期管理,包括按需加载、代码预热、实例卸载回收等工作。

一站式发布运维平台(FaaS Platform)是面向开发者的主要操作平台,开发者在平台上进行函数编写、版本提交发布、回滚、监控运维等一系列工作。整个监控体系打通了集团的基础服务监控体系,,可以提供实时大盘,集群性能等基本监控指标的查询功能。

 

整体技术栈服务端容器层主要是采用Java实现, 

前端主要基于React框架和Dva状态管理框架实现。 React提供了组件化的概念,这意味着我们开发的组件可以像HTML基本DOM元素一样不断被复用。为了实现组件的复用化和研发效率的提升,Bigfish在Web页面上进行了分层设计,细粒度从大到小依次为:页面模板 -> 区块 -> 业务组件 -> 组件。Odin脚手架是优酷推出一款面向中后台业务系统的前端开发脚手架,集成了Bigfish的框架,支持以配置化的方式构建网站路由,使得开发者不需要关注过多底层细节,可以快速上手实现业务逻辑和页面构建。

image.png

类似于服务端侧的MVC分层模式,前端在实现业务逻辑和数据通信时也有对应的封层设计模式,来实现组件的状态管理。经历了从Flux -> Redux -> Dva的衍变,状态管理机制对复杂业务带来的益处正在不变突出。Dva的完整数据流图如下:

image.png

State是负责保存整个应用状态,View是React组件构成的视图层,Action是描述事件的对象。connect方法是绑定 State 到 View的函数,使得View层的组件可以动态监听State中的属性,同时可以通过dispatch方法负责将Action发送至State触发状态改变。

触发状态改变有两种类型的函数:effect函数和reducer函数。前者会与服务端进行数据通信,可以处理异步动作;后者处理同步动作,并直接更新State。

FaaS Platform前端主要分为函数创建、函数管理、函数发布、函数模板和应用统计五个模块。在FaaS Platform系统中,函数是对外可被调度的最小单元,而应用是划分机器资源的最小单位,所以我们设定应用与函数存在一对多的映射关系。

image.png

函数创建模块

函数创建模块主要提供添加函数的功能。一个完整函数必须包括函数名称、函数标识、函数类型、函数所属应用及应用下所属分类等基本信息;同时类似于mtop网关,我们提供对于函数入参、响应业务结果、响应业务错误码的配置页面,用于自动生成函数调用入参表单和函数接口文档。函数的英文标识唯一确定一个函数,不可重复。

函数管理模块

函数管理模块主要提供函数的CRUD操作和函数的在线编写功能。 可以快速进行复杂条件的函数查询和函数基本信息和状态的编辑。同时我们提供函数编写的在线Web IDE,支持文件增删、代码编写、自动保存、函数提交、函数调试、日志打印等功能。

函数发布模块

函数发布模块主要提供函数提交历史的查询和执行函数发布的功能。我们像传统Java应用支持引入二三方依赖,但不同于传统的Java应用发布,FaaS Platform系统中的函数发布可以实现秒级发布。目前函数发布已经支持函数回滚发布和函数分批次发布,从部署环节实现对复杂多变业务需求的快速响应。

函数模板模块

函数模板模块主要提供函数模板的CRUD操作和函数的在线编写功能。结合实际的业务场景,我们首先提供一些基础的内置模板,方便函数的快速初始化。同时对于某一个业务问题的完整解决方案,我们允许该函数保存为自定义的函数模板。函数模板的Web IDE同样支持函数模板的在线编写、调试、自动保存等功能。

应用统计模块

由于函数隶属于应用从而具备机器资源,我们计划提供应用统计模块以应用为拆分进行函数上线状态、发布版本的数据统计;同时我们也基于函数日志提供函数调用情况(调用量、成功率、响应时间)的统计分析和监控。 

3 主要特性

优酷FaaS平台的主要特性是开发接入低成本、函数运行时环境隔离以及运维监控操作的透明化。

image.png

开发接入低成本

FaaS平台通过一站式的云端开发平台,使用户可以直接面向业务逻辑的开发,而无需关注基础服务及中间件的依赖,平台本身提供完善的基础能力封装,包括:快捷开发能力,中间件快速接入能力,数据存储快速接入能力,基础能力封装直接调用等。

业务逻辑开发模式轻量化、无应用化,发布回滚秒级生效,极大的减轻了传统服务端开发过程的繁琐流程,将开发者的精力更多的集中于核心业务逻辑的开发。

同时提供如下的简洁易于操作的开发部署流程设计,减轻开发者开发部署的时间成本。

image.png

FaaS平台上的函数除了开发成本低,调用者接入的方式也比较简单。 函数代码的编写、调试、发布均在一站式运维发布平台上完成。在中心化接入方式下,我们通过统一的函数服务集群提供对外服务,允许调用者通过统一的函数调用接口以HSF服务或者HTTP接口调用函数,而函数代码的执行完全在我们的函数服务集群上,开发者无需自己申请应用。

对于去中心化接入方式,开发者如果想调用函数平台上的FaaS函数,可以引入我们提供的SDK,此时,函数的执行完全在调用者应用的本地进程里,FaaS平台只提供函数的开发发布功能。

运行时环境的隔离

运行时环境的隔离分为两个层次,一个层次是函数容器内部函数实例之间的隔离;

另外一个层次是不同函数本身就运行在不同的虚拟应用集群上,集群与集群之间的隔离性。

函数容器内部函数实例的隔离指的是在FaaS平台上编写的Groovy函数运行在统一的JVM进程中,每个函数在开发的过程中都会生成多个版本,而不同函数之间、同一函数的不同版本之间在运行时的环境都是相互隔离,互不干扰的。

image.png

函数运行集群的隔离性主要是根据函数的访问量、函数的服务特点(长尾服务还是通用服务)等特性,在函数创建之初就将函数绑定在不同的虚拟应用上,而不同的应用会运行在不同的机器集群上,函数在被调用时,网关层可以根据函数的应用将函数的调用分发到不同的集群上执行,保证函数之间物理隔离。

image.png

运维监控的透明化

FaaS平台的函数都能在平台上直接进行监控运维操作,我们通过在函数执行流程上收集函数的执行日志,并将日志实时上报到集团监控服务,可以在平台上实时监控函数运行。

image.png

4 技术难点

函数执行引擎设计

函数执行引擎是整个FaaS的核心部分,负责函数实例的加载、预热、调度执行、卸载等生命周期管理。FaaS的函数目前支持Groovy语言,选择Groovy主要是由于JVM提供的运行时环境天然支持Groovy语言的运行。FaaS平台上每个函数都具有一个自己独立的代码版本库,每次提交都将生成递增的版本,执行引擎加载函数实例时会从版本库中加载当前最新版本的代码,通过初始化、预编译等操作生成函数的实例放到实例池中,由于每个函数都有唯一标识,因此,当调用某个具体的函数时,执行引擎会从实例池中取出对应实例加载执行。整个流程如下图所示:

image.png

由于函数实例都存在于同一个JVM进程中,并且不同于服务,函数的粒度更小,因此函数的生命周期需要严格控制,不然大量函数加载到内存中,有可能出现内存占用过大的问题。同时兼顾SDK调用方式,防止多个函数常驻内存将宿主应用的内存耗尽。所以目前采用了懒加载机制,按需加载函数实例到内存中,过期自动回收,有助于释放内存提高内存利用率

image.png

每个Groovy函数对应一个Groovy的解释器环境GroovyEngine,不同的函数之间相互独立,每个函数在加载到内存的过程中都分别独立的进行预编译,初始化等流程,防止不同函数之间相互干扰,同时为二三方JAR包加载提供隔离的环境,防止出现不同函数之间的类加载器相互影响的情况。

image.png

二三方JAR包加载能力

FaaS平台提供二三方JAR包的加载能力,允许在不重启整个底层容器的情况下,加载函数自己的二三方依赖,我们通过实现Groovy二三方JAR包加载能力的Classloader,实现了函数与函数之间、函数不同版本之间的二三方依赖加载能力。FaaS平台的Classloader体系:

image.png

三 FaaS平台的落地探索

结合目前阿里文娱业务的特点,即大多以内容分发为主,以首页、二级页等业务来看,内容分发具有运营坑位多、需求变化快、数据源多等特点,传统的Java服务端开发方式,前后端联调以及后端开发部署都逐渐成了影响迭代效率的重要瓶颈,以往都是服务端开发在客户端发版前发布线上,发布耗时长,回滚成本高,因此通过引入FaaS,希望提高服务端开发的灵活性,让开发者更多的面向业务逻辑而不是花较大量的时间在服务的部署维护上面。

image.png

 

1 统一的数据源封装

我们使用FaaS实现数据源接口的封装,当有新的数据接口需要接入时,直接在FaaS平台上通过编写函数实现,可以做到在本地Java应用不发布的情况下,直接上线新数据源。对于新业务接口的快速接入具有重要意义。同时这些数据源可以被重用,因此在多人协作的模式下,通过复用函数实现的数据源极大的减少了重复开发量。

image.png

2 FaaS函数处理API协议模版字段映射

image.png

我们扩展了搭投框架,通过Faas的SDK,服务端接口的模版解析阶段除了能解析普通的Java函数,也可以支持解析FaaS函数,这类函数的代码不是通过原生Java代码编写,而是在Faas平台上用Groovy代码编写而成,这类函数的特点是编写、更新、发布均不需要重新部署哥伦布业务应用,只需要在Faas平台上操作函数即可。字段逻辑的修改可以完全不用重启Java应用,快速应对迭代变更。每个函数都有独立的生命周期和发布流程,不同函数的发布变更之间相互隔离。当有字段逻辑的变化时,可以完全不重启本地Java应用,直接通过函数的秒级发布来完成,极大提高了迭代效率。

四 总结与展望

目前优酷内容分发相关业务已经陆续引入FaaS能力,在FaaS的助力下,迭代效率提升。但是平台整体上还处于刚刚起步阶段,也是我们Serverless实践的初步尝试。后续我们希望在以下几个方面继续探索FaaS平台的技术与落地:

  • 支持更多编程语言的运行时环境,以及更友好的云端IDE开发体验。
  • 优化函数运行集群的资源调度策略,合理分配函数执行需要的资源,支持动态扩缩容。
  • 结合内容分发业务的特点,寻找更多业务的切入点,通过FaaS进一步提升现有技术架构的灵活性和迭代效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】maven的生命周期和概念图

maven的生命周期: 在maven中存在三套"生命周期",每一套生命周期,相互独立,互不影响的,但是中同一套生命周期里,执行后面的命令会自动先执行前面的命令 CleanLifeCycle:清理的生命周期 clean defaultLifeCycle:默认的…

YashanDB亮相数据技术嘉年华精彩不断

4月12-13日,由墨天轮数据社区和中国数据库联盟(ACDU)主办的第十三届数据技术嘉年华 (DTC 2024)在北京召开。崖山数据库系统YashanDB受邀亮相,多维度展示了YashanDB的独特技术、创新成果与行业应用。 数据库…

大话设计模式之享元模式

享元模式是一种结构型设计模式,旨在有效地支持大量细粒度的对象共享,从而减少内存消耗和提高性能。 在享元模式中,对象分为两种:内部状态(Intrinsic State)和外部状态(Extrinsic State&#xf…

代码随想录阅读笔记-回溯【复原IP地址】

题目 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201…

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难,可以转换为一维的字符串,在一维字符串中考虑较为简单,要注意本题中两个字符交换位置时只能是x和另外字符交换,本题另外一个难点在于如何…

TypeScript系列之-深度理解基本类型画图讲解

JS的类型(8): null undefined string number boolean bigint symbol object(含 Array, Function,Date.....) TS的类型(87): 以上所有,加上 void, never, enum, unknown, any 再加上自定义类型 type interface 上一节我们说…

判断IQ水平-第12届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第50讲。 判断IQ水平&#…

利用栈删除数组中重复元素

先将数据排序(降序或升序) 建立一个“栈”,三种情况: 1.栈为空:压入一个元素 2.栈不为空 且 栈顶元素不等于将入栈元素:压入一个元素 3.栈不为空 且 栈顶元素等于将入栈元素:删除将压入元素…

SCI 四区(JEI)投稿到录用过程中的经历和心得体会

计算机视觉领域中,包含目标检测、三维重建、语义分割、图像分类等分支。其中,目标检测分支最卷,你知道的,没有背景和资源,发一篇SCI属实不易。本篇博客详细介绍本人投稿到录用过程中的经历和心得。 目录 1. 硬件资源落…

微信云开发小程序的服务器是属于服务商的还是商家的

越来越多的小程序,选择使用微信云开发来进行开发。然而,关于微信云开发小程序的服务器归属权问题,往往会引起一些商家的疑虑。本文将详细解析微信云开发小程序的服务器是属于服务商的还是商家的。 首先,我们需要明确微信云开发的概…

maven引入外部jar包

将jar包放入文件夹lib包中 pom文件 <dependency><groupId>com.jyx</groupId><artifactId>Spring-xxl</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/Spr…

1042: 中缀表达式转换为后缀表达式

解法&#xff1a;直接给算法 创建一个栈和一个空的后缀表达式字符串。 遍历中缀表达式中的每个字符。 如果当前字符是操作数&#xff0c;直接将其添加到后缀表达式字符串中。 如果当前字符是操作符&#xff0c;需要将其与栈顶的操作符进行比较&#xff1a; 如果栈为空&#…

动态规划专练( 337.组合总和Ⅳ)

337.组合总和Ⅳ 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#x…

2022年蓝桥杯省赛软件类C/C++B组----积木画

想借着这一个题回顾一下动态规划问题的基本解法&#xff0c;让解题方法清晰有条理&#xff0c;希望更多的人可以更轻松的理解动态规划&#xff01; 目录 【题目】 【本题解题思路】 【DP模版】 总体方针&#xff1a; 具体解题时的套路&#xff1a; 【题目】 【本题解题思…

Python判断节假日的几种方式,你学废了吗?

最近在推进信息安全巡检的工作&#xff0c;按公司制度要求和信息安全标准&#xff0c;要求按时对硬件设备、网络、机房、应用系统、数据库等等做巡检工作。为了保证达到信息安全的目标&#xff0c;要求在每周四和节假日的前一天对各类设备和系统进行巡检。 1、使用holidays库判…

zookeeper分布式应用程序协调服务+消息中间件kafka分布式数据处理平台

一、zookeeper基本介绍 1.1 zookeeper的概念 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、…

python小游戏

这些游戏你玩过几个&#xff1f; 1.贪吃蛇2.吃豆人3.加农炮4.四子棋5. Fly Bird<font color #f3704ab>6.记忆&#xff1a;数字对拼图游戏&#xff08;欢迎挑战&#xff01;用时&#xff1a;2min&#xff09;7.乒乓球8.上课划水必备-井字游戏&#xff08;我敢说100%的人都…

代码随想录算法训练营第二十七天|39.组合总和、40.组合总和II、131.分割回文串

39.组合总和 思路&#xff1a; 本题和77.组合 &#xff0c;216.组合总和III的区别是&#xff1a;本题没有数量要求&#xff0c;可以无限重复&#xff0c;但是有总和的限制&#xff0c;所以间接的也是有个数的限制。 本题搜索的过程抽象成树形结构如下&#xff1a; 注意图中叶…

《HF经理》:二认知误区

一、管理者掌握重要权力&#xff1a; 二、全力来自管理者的职位&#xff1a; 三、管理者必须控制自己的直接下属&#xff1a; 对策&#xff1a;展示自己的品质&#xff0c;能力和影响力 四、管理者必须建立良好的个人关系&#xff1a; 五、管理这必须确保一切运行正常&…

【爬虫开发】爬虫从0到1全知识md笔记第5篇:Selenium课程概要,selenium的其它使用方法【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫课程概要&#xff0c;爬虫基础爬虫概述,,http协议复习。requests模块&#xff0c;requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…