大家好,我是Open Function的发起人郭敏杰然后今天我就会和我的同事刘冠军一起跟大家分享Solace方面的一个topic主要是说怎么样用零元生的Solace技术去构建一个现代的fast平台我们知道加州大学波克力分校它有一篇关于Solace非常著名的论文这个论文也提到了就是说Solace会是运计算发展的下一方向然后它的重要性会逐渐的上升它对Solace定义就认为Solace是等于fast加fast然后具体来看我们可以看到这张图里面最底下是一些硬件存储然后上面其实是一个基础的运动台在各家军场上可能都是差不多有VM、VPC、存储这样的一些组件最上面一层我们可以看到它是一个应用的视角上面是用户的应用在用户的应用和运动台之间的一层很大的程度上它可以叫成之为Solace中间的一层我们可以看到它基本上分为两类一种是运上的一些基础的服务比如说是对样存储KVA的Ditabase然后大数据的一些组件还有MQ另外一类就是Function和Solace的Function其实我们可以看到就是说对于Baccon的Solace就是运上的这些基础组件其实各家军场上可能都是提供的组件其实都是差不多的然后最主要的区别就是Fas的这一层它其实是一个Solace的一个核心我们今天就是主动着重的讲一下Fas的这一层我们先看一下就是在Solace开源领域的项目的一个现状我们也调研过就是现在的开源的Fas项目它觉得多数是启动的比较早的大部分都在Knetail出现之前其实就已经存在了比如说OpenFas还有Cruelace还有Fusion之类的具体到Knetail它是一个非常好的一个Solace平台但是Knetail Serving它是其实它只能够运行应用它不能运行喊数所以我们不能从Knetail Serving是一个Fas平台同样的Knetail音乐厅其实也是一个非常优秀的事件管理框架因为Fas其实都是有很多时候是由这个事件来驱动的但是Knetail音乐厅它设计的过于复杂但是可能是一些专家的用户可能会用的比较好对于普通的用户用起来是有一定的温看的我们来看一下现在应该是最流行的一个Fas项目叫OpenFas它其实技术战其实是有点老旧的就是说就个例子来讲它是依赖于PlanPulse和Orlet Manager去做Auto Scaling的也说会根据PlanPulse的一些Magics发送告警到Orlet Manager然后再由Orlet Manager这个告警去触发喊数的自动伸缩我们认为并不是一个很专业的一个做法为什么呢因为Orlet Manager其实和PlanPulse它是用于监控告警的如果你非把它用做Fas平台的一个自动伸缩其实是不是很对的我们同时也注意到近年来它音乐声演绎的创新还是非常厚在Solace演绎其实也是一样的陆续出现了一些比较优秀的元项比如说Kether,Diver,Carnity,Buildpacks,Tactile,Separate我们后面会逐渐地讲到结合我们上面讲的Solace开源领域的现状然后我们认为现有的开源的Solace或Fas平台它并不能够满足构建一个现代的元人生Fas平台的一个要求元人生Solace领域的进展却是为构建新一代Fas平台提供了可能我们后面逐渐地会讲到这些技术我们就看一下构建一个Fas平台它具体都需要哪些东西Fas吧,首先它需要function这个function是由functionSpike去定义的有了function和functionSpike其实它也还不能运行它必须得变成一个application通俗点就是你必须从一个函数变成一个带有闷函数的一个应用这个过程就是把函数变成应用的过程其实是一个transform的一个过程或者换成过程有了应用之后它也不能运行它必须得build的时候DockerImage或者是Vanderer所以是有一个build的过程build出来进一项之后你必须要把这个景象去部署到一个资源的一个run time里去这个run time它必须有一些特征它的特征就是说它能够有monitor和auto scaling的能力就是说它会动态地监控函数的实力的一些metrics然后并且根据这个metrics去进行一些决策这个决策就是说我是否要伸缩函数实力的副本数那有了server的run time就是你部署好了函数之后你得把函数提供服务到外面去其实是有两个方式那对于同步函数来讲大家一般都是通过一个API网国安发送rest或者是jabc的请求我到这个API网国安然后函数实力然后执行完了之后立马把结果返回给调动者这是一种同步函数其实函数很多时候是由这个事件来触发的比如说Kavhara的eons或者是一些对象准备处的一些事件比如说你上传了一张图片然后给他了一些eons那这样的它有这个事件管理它是事件触发的所以就需要有一个事件管理框架去触发这样一个函数的一个异部的一个运行所以就需要有一个事件管理框架下面我们就会按照帮它讲关键的级点去看一下去怎么实现这个购店发布品牌里面比较重要的几个部分首先函数找函数应用通过什么方式把函数找函数应用到我们认为要通过这个function from work这个function from work的作用我们可以做一个简单的解释就是说你现在比如说有这样一个function是个Hello World他就收到请求会打印一个Hello World这个函数是不能运行的所以我们要通过函数框架就是把它整换成一个带有闷函数的这么一个应用我们可以看到高量的部分就是我们刚才写的刚才展示的函数它是被包裹在了闷函数里面然后通过register这个函数它其实是把它给注册到函数框架里面去了我们根据函数框架它现在是支持HTPE Cloud Events还有我们自己Open Function在这种spec所以这是把函数找成应用需要函数框架的一个支持另外一点就是你构建函数你有了这个应用之后需要把这个应用构建成可运行的image我们知道现在Build领域的一个现状就是KBS它已经提映了Docker作为它来改变Rampire也就是我们不能在KBS里面用Docker-in-Docker的这种方式去Build的Docker进向那我们还有什么选择呢去怎么去管理BuildPipeline其实都是问题那对于BuildPipeline其实原生领域也有一些比较成熟工具比如说TactileTactile管理Build有限制三部分一个是或许代码Build image然后Push image那对于实际出发实际进行Build的过程的工具其实也有一些选择除了Docker之外主要分为两类一类是CarnityBuildPax这是Pivots和侯若谷开源的一个新型的Build工具就是它不依赖于Docker-file它是会去自动的分析你这个原在码是需要用什么方式去Build的然后它会一层一层的去把Hose i 标准的安排纸给Build出来比如说它是不依赖于Docker-file那另外一类的Build技术就是依赖于Docker-file就是下面这三种BuildH、BuildCade和Carnity就是都是依赖于Docker-file那这就有一个问题了就是说我们有这么多工具怎么在这个工具之间进行选择然后选择了一个之后怎么进行切换所以这会有这么一个问题那其实就是涉及到另外一个项目这是红帽和FM开源叫Sypride这个项目它就是能够解决我们上面谈到的这个问题它能够在几种Build的工具之间进行切换或者提供一个选择它上面提供了抽象的一层然后使你切换的过程就变得很容易据个例子来讲比如说它会定义一个Build的这么一个CRDCRD里面其实重要的就是三部分一个South就定义你的去哪儿去找你这个因应的代码另外一个就是Output就是你一个倾向遍端之后就是Push到什么地方去最重要的就是StrategyStrategy它其实是定义了用什么方法去Build的这个应用那我们可以看个例子就比如说这个例子就是说它是用Build Pax去Build的这个进向了这么一个实力那我们可以看到它有两个step一个是Prepare一个是Build and Push那这每一个step其实都会被转化成Type Town里面一个Task然后整个这两个step会穿成一个Prep plan然后由Type Town的Prep run去把它给热起来执行Build的过程那这个是Build A是一个脚本比如说用户可以定义不同的Build Stresety去在不同的工具之间进行切换但是它也是有统一的API一控制的这个是非常好用的那么这就是FunctionBuild的继续到Function的Serving的Function服务其实SyncCf它Service package里面定义了四种函数的调用类型就是上面这四种有同步的有异步的有基于MessageQ的有这种账户类型的函数那在我们看它其实就是可以把它简化成两种一种就是说是头部来说它一般是ATP的然后是Blocking然后也就是说用户发一个Request它必须得等到一个Response然后才会认为这个函数结束然后才有返回那另外一种就是一把函数也就是说它发了一个Request它必须要等到一个Response它就可以直接的返回然后有函数框架去进行对它这个议问事情处理那同步函数和异步函数它是有不同的运行室的包括Conditio Serum其实它是一个非常好的一个同步函数的运行室那同时我们也关注到就是Keta和Keta的ATP插件去配合Department它其实可以作为一个另外一个可选的同步函数的运行室这个后面我们会讲对于异步函数异步函数我们是我觉得是Keta就是Keta和Department的就是Keta可以对各种试验员根据各种试验员的特性对一个Department或者照顾一下伸缩它的复管Department是用于解偶对各个MQ的访问Keta和Department配合可以作为一个异步函数的一个运行室这个后面我们会展开其实函数里面最重要就是自动伸缩这是Keta和Department一个自动伸缩的机制今天我们就好时间关系我们不展开了大家有兴趣的可以去研究一下Keta和Department这么一个自动伸缩的机制如同讲一下就是KetaKeta其实我们知道它是只能对ATP类型的数据员进行自动伸缩Keta的作用就是说因为它是能够根据各种各样其他多种类型的试验员的特征去进行自动伸缩它的原理是也就是我们大家都知道Punitive员有HPA但是HPA的它就是只负责把这个工作复杂从1到N之间伸缩的这么一个过程但是它是不能够缩容到0也不能够从0个负责缩容到1从0到1之间自动伸缩的过程就是由Keta来过程然后Keta它它其实是把HPA和它自己的这套机制结合起来所以就实现了一个根据多种试验员的特征把这个工作复杂从0到1之间伸缩的这么一个过程我们可以看一下Keta它支持的试验员其实是很多的其实分为几类一个就是银上的服务比如说是PWS的KinesisSGR的MQ另外一种就是开源的一些组件比如说KafkaRalliesPrompto4Prompto4不能够skill到0了当然还有一些另外一类就是CPU或者是ChromeJob这样的一个试验员我们可以看到例子简单的讲一下KetaKeta其实我们可以看到它订一个skill object其实订一了就是你伸缩的一些特征比如说你最大的负本书最小的负本书我们可以看到这个例子里面它是最小可以收缩到0最大可以扩容到10个负本然后是你是多长时间去检测一下它的matrix这里面PoIntel是15秒然后是Code Down Parade就是我检测一下之后我伸缩完了之后我要保持30秒的时间然后再去决定是不是下一次还要继续的伸缩这个负本比较重要的就是Trigger的部分Trigger定部分我们可以看到它的类型就是对Kaoka进行伸缩然后是根据了哪一个Kaoka的哪一个topic里面的哪一个Consumer Grover进行自动伸缩其实比较重要的就是Lag12互的这个就表示你消息堆积的数量这什么意思呢比如说你消息堆积超过了10它就会加一个负本如果是到了20它可能会又加一个负本那你对一个消息的堆积如果是零了比如说都消费完了所以它就会伸缩到0输缩到0这是Kaoka的一个原理那当然我们刚才可以看到我们其实是没有在Kaoka里面看到对于ATB这种实验源的伸缩它其实是由Kaoka的一个ATB插件去实现的其实现在还是在一级的开发中现在还是一个费的状态然后我们也会密切的关注如果插件是完全的稳定的Ga的状态我们会把它集成到我们方式里面去作为一个T1Kaoka的一个同步还是会有一件事还负责服务其实涉及到另外一个项目叫DeprDepr是微软开源的叫分布式应用预警式它其实是把这个分布式应用的能力给抽象成了几类比如说你分布式的应用一般都会有无间的调用一般都会有状态的管理一般都会有这个事件驱动也就是说你会publish有一个pub salad这么一个过程然后分布式应用同样会有一些输入和输出也就是说涉及到一些resource funding还有一些可观测性经济数据的访问抽象成这些能力之后它会把这些能力用HTPE或者是JRPC API的方式提供给各种各样的语言来使用然后你的应用使用这些语言开发就可以调用这些语言的Depr SDK去访问这些分布式的能力它的好处其实在哪我们可以看到分析一下就是说你如果你这个方式你不用Depr你有五种语言的function的这种支持你要对接10Garmic的话你就要写50种实现对于有了Depr之后因为我们知道它其实是提供了一种HTPE或者是JRPC的实现也就是说它实现了一个虚拟的MQ也就是说你对五种语言只需要对接一种MQ就可以了所以它只需要写五种实现对吧所以我们认为Depr其实它能够极大的减化应用开发的负担然后它能够使尤其适合于Solace这种多语言的开发所以我们觉得应该有标引度Depr作为方式设定的一个背后支撑的一个技术下面就有我的同事刘安军来给大家讲一下OpenBound我们开源的OpenBound它的架构还有一个单码新面交给安冠军为了解决目前发自存在的问题我们基于这些新的技术开源了OpenFunctionOpenFunction主要包含这几部分FunctionFunction是用于定义一个函数的它包含了函数勾件经向以及运行所有所需要的参数当一个Function被创建的时候我们会触发一个Build过程它去Build我们的镜像当镜像生成完成以后我们的Server会去运行这个镜像根据我们Function的类型不同我们会使用不同的运行时去运行这个镜像同步的函数我们会使用同步的运行时去运行然后同步的运行时是由Cognitive去实现动态声缩的异步的函数我们会使用异步的运行时去运行异步运行时我们使用的是Depr加上Kid去实现这种动态声缩的过程后期我们也会支持使用Kid的这种同步的运行时去运行函数EventSauce是用来管理试电源的因为我们CognitiveEventing它比较复杂对于普通用户它的没看比较高所以我们自己实现了EventSauce用来管理试电EventSauce首先我们包含EventSauce用来去对接各种各样的试电源然后我们使用的是这种异步的函数来对接我们的试电源可以实现这种根据试电的数量进行动态声缩的功能当EventSauce收集到数据源以后收集到数据试电以后我们可以把试电直接调用我们的这种同步函数然后给试电源发挥一个结果也可以将我们的试电写入到EventBusEventBus我们实现了跟底层的MQ进行了这种解药所以我们可以使用任意类型的MQ去存储我们的试电EventBus中的试电可以直接触发异步函数也可以去通过一个Trigger实现这种过滤对过滤完的试电我们可以重新写入到MQ进而去触发异步函数下面我们通过一个Demo对于这个Open Function做进一步的了解这个Demo是一个使用Open Function实现日致告警的Demo我们将Kiba S平台的日致写入卡发卡然后用一个异步函数去消费日致对日致进行过滤当日致中包含4045的时候我们会出发一个告警键额发送一个通知消息到Slack下面给大家看一点试一下这是我们的一个容器平台然后首先我们会我们容器平台有自己的日致可以看到这个日致是实施这个日致是实施的然后我们会配置一个配置一个日致收集这样我们会把我们的日致导致到我们的卡发卡里面同样的我们会配置一个我们的通知系统我们配置一个Slack的通知我们会发到TES这个拆脑里面我们的日致是由这个叫WordPress这个负载去产生的这个负载我们已经不说好了大家可以看一下我们的方式实际上对应的是我们底层的它负载实际上是有我们底层的这个deployment来实际运行的就是我们的这个deployment大家可以看到这个deployment刚刚已经完成了一次伸缩现在进行了下一次伸缩因为我们的这个日致量又增大了所以它现在伸缩到了更多的负本数现在日致量我减少了所以说这个一旦处于伸缩过程然后我们可以简单的出发一个例子可以看到这是我们之前出发的一个例子大家可以看一下一个404的错误这是刚刚我们出发的这个可以给大家简单的介绍一下我们的这个这个例子也就是说首先看一下我们的这个这个函数这个函数的作用很简单就是我们从这个demoproject下面的demo space里面这个wordproject这个应用里面去筛选404的包含404的日致如果存在这种日致的话我们会把它发送到我们的notification manager然后产生这种通知大家可以看一下这个functions的定义functions定义我们在前面讲过functions已经核心首先我们的emide就是我们要产生的这个冰箱然后这是build的部分用于build的镜像然后首先是build的镜像然后是我们的bit hub的地址7包用于这种运行镜像的部分这是我们的异布函数然后这个地方是用来定制我们的这个可以用来定制我们的工作负载然后我们这边 input就是卡不卡output就是我们的东西然后这个地方就定义了我们的depot的两个组件这边k的这部分就是用来实现动态伸缩的这就是我们的这个例子然后我们的看一下我们的rootmap目前我们已经开发到了0.4.0的版本预计在2022年的异度会开会release 0.5.0的版本这个是openfunctions下一步的这种计划首先是支持这种ingress然后用ingress为functions创建一个统一的访问入口第二个是支持我们自己的这种openfunctions的同步的函数第三个就是支持Pathen的function framework and builder然后我们会实现openfunctions的APIGL去实现自己的console然后是支持函数编排然后支持这种Rust function和webassembly runtime最后呢适合Skywelcome进行整合支持这种function的吹损以上就是我们这次分享的全部内容大家可以关注公众号然后加入到我们的社区群有问题的同学呢可以在线上进行提问