如何落地一个FaaS平台?

news2024/11/13 23:18:16

 

简介: 函数即服务(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进一步提升现有技术架构的灵活性和迭代效率。

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

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

相关文章

01-Git 之快速入门操作本地仓库

https://learngitbranching.js.org/?localezh_CN在线练习git 1. Git 安装好Git以后, 先检查是否已经绑定了用户名和邮箱 git config --list1.1 为什么要使用版本控制? 从个人角度: 在做项目时,如果一点点去改代码会很乱,不利…

华为云开年采购季:企业级市场的火爆营销炼成记

作者 | 曾响铃 文 | 响铃说 销售火爆,一单又一单,“生意好个不停”。 这一幕,常常发生在C端消费品市场上,要么是线上爆单,要么是线下人头攒动。 而现在,在B端企业级市场上也发生了类似的情景。 自3月1…

ZJJ-2A直流绝缘监视继电器额定电流3.1mA额定电压110VDCJOSEF约瑟

系列型号 JJJ-1绝缘监视继电器; ZJJ-1/A绝缘监视继电器; ZJJ-1A绝缘监视继电器; ZJJ-2型直流绝缘监视继电器 ZJJ-2直流绝缘监视继电器; ZJJ-2B直流绝缘监视继电器; ZJJ-2AC直流绝缘监视继电器; 用途…

Day 41:动态规划 LeedCode 343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 思路: 1.确定dp数组&#xff0…

《TinyLlama: An Open-Source Small Language Model》全文翻译

【Title】 TinyLlama:开源小语言模型 【Abstract】 我们推出了 TinyLlama,这是一个紧凑的 1.1B 语言模型,在大约 1 万亿个令牌上进行了大约 3 个时期的预训练。 TinyLlama 基于 Llama 2(Touvron 等人,2023b&#xff…

自定义Centos的终端的命令提示符

背景 当我们使用终端登陆Centos时,就自动打开了ssh终端。这个终端的命令提示符一般是这样的: 这个以#号结束的一行字,就是我们说的命令提示符了。 这个是腾讯云的服务器的提示符,可以看到主机名是VM-4-7-centos。 但是这个看起…

Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

SD-WAN提升企业网络体验

在现代企业中,网络体验已成为提升工作效率与业务质量的关键因素。SD-WAN技术的出现,以其独特的优势,为企业提供了优化网络连接、加速数据传输、提升服务质量和应用访问体验,以及增强网络稳定性的解决方案。接下来,我们…

设计模式在芯片验证中的应用——策略

1. 策略模式 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 在RTL设计中可能包含了复杂的多个访问仲裁逻辑,使用了多种算法来确定访问内存优先级顺序&am…

plc远程监控系统

随着工业4.0时代的到来,智能制造成为了工业发展的核心驱动力。在这个信息化、网络化的新时代,PLC远程监控系统以其强大的监控与管理能力,正逐渐成为工业自动化领域的明星产品。今天,我们就来聊聊PLC远程监控系统以及HiWoo Cloud平…

网络协议——OSPF(开放式最短路径优先)详解

1.什么是OSPF 开放式最短路径优先OSPF 是一种动态的高度可靠和高度可扩展的路由协议,用于构建大型网络中的动态路由系统 2. OSPF的协议号为:89 3. OSPF的特点: OSPF是链路状态协议使用了区域概念:减少路由选择协议对路由器CPU,…

从零开始学习Linux(1)---基本命令(1)

1.学习准备 我学习Linux是使用xshell远程登录自己的云服务器来进行。 xshell是一个远程终端管理软件,下载官网: https://www.netsarang.com/products/xsh_overview.htm 下载安装的时候选择 "home/school"…

H.265网页无插件播放EasyPlayer.js流媒体播放器常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…

「每日跟读」英语常用句型公式 第12篇

「每日跟读」英语常用句型公式 第12篇 1. I’m having a hard time __ing 我现在不太能__(遇到困难) I’m having a hard time concentrating on my work.(我现在不太能集中注意力在我的工作上) I’m having a hard time slee…

UE5 把蓝图内的变量和事件暴露给序列使用

在蓝图变量内勾选Expose to Cinematics 事件: 在角色内添加自定义事件 在序列内对着角色的号添加Event,选择Trigger 添加关键帧,然后在关键帧右键添加class,在class下绑定事件

抖音小店新手玩家能做吗?跟着我的步骤做,爆单很简单

大家好,我是电商笨笨熊 抖店新手玩家能做吗? 当然可以。 抖音小店自推出以来已经吸引了无数的新手玩家,且不少玩家从个人走到了团队化。 新手做抖店,最重要的是掌握方法,只要方法对了,方向对了&#xf…

工业物联网网关

在数字化浪潮席卷全球的今天,工业物联网(IIoT)作为连接物理世界与数字世界的桥梁,正在逐渐改变传统工业的面貌。而作为IIoT的核心枢纽,工业物联网网关发挥着至关重要的作用。今天,我们就来深入了解一下工业…

leetcode代码记录(回文数

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序&#x…

web笔记再整理

前四天笔记在此连接: web前端笔记表单练习题五彩导航栏练习题-CSDN博客https://blog.csdn.net/simply_happy/article/details/136917265?spm1001.2014.3001.5502 # 1.边框弧度​ div {​ width: 300px;​ height: 50px;​ background-color: aqua;​ …

JAVAEE——网络初始

文章目录 网络发展史独立模式网络模式局域网LAN路由器的诞生 网络通信的基础IP地址端口号 认识协议OSI七层模型TCP/IP五层模型 网络发展史 独立模式 在原始的年代中电脑间想要通信需要两台电脑连接一根网线,但是一台电脑基本上只有一个接口。因此想要链接更多的电…