开发者学堂课程【云上能力本地化之边缘计算:Link Edge函数计算介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/559/detail/7672
Link Edge函数计算介绍
内容简介:
一,为什么产生Function Compute@Edge
二,Serverless
三,编程模型
四,例子
一,为什么产生Function Compute@Edge
为什么在Link lo T Edge之上会有函数计算
1,Link lo T edge作为一个通用的边缘计算产品,需要一套通用的编程框架,用于在数据源处就近处理数据,完成特定的业务逻辑或执行复杂的分析算法,什么意思呢Link lo T edge它是边缘计算,为了要支撑计算,或者说让这个计算可以被自定义,可以让用户开发者在上面能够自定义他们的计算逻辑,我们一定要有一套编程框架,来支撑这样一个自定义的实现。
第二个就是编程框架它一定要通用,因为通用才能满足就是最广大开发者的需求,也能够适配在更多的环境里面,作为边缘框架其实是有很多选择的,像比较常见的解决方式就是会有编程语言加SDK的方式。
譬如说像安卓就选用了Java语言作为它的应用编程框架,然后他会提供安卓环境的library或者SDK,像Linux它选用了C作为它的编程语言,然后也提供了一些system core或者是library这样的library,来构成它的上层应用开发的标准框架。
那Link lo T edge如果要提供这样的编程框架,其实也可以选择这样的框架,但是我们在选编程框架的时候还有一些其他的考虑。
2,选用的编程框架
他拥有良好的开发者生态,然后被开发者广泛的接受。
3、是说我们希望我们的选用的编程框架能够减少开发者的工作,也就是说我们帮开发者做的事情越多,开发者做的工作就越少,它的效率就能更高。
4,我们希望我们的编程框架不是从零开始开发的,是复用了我们积累的技术的一部分,综合以上的这些考虑,最终我们就选用了
Function Compute@Edge来作为Link lo T edge一个通用的本质框架。
Function compute这样的机制它有什么优势呢?或者有什么不同呢?
其实我们仔细的随着我们后续的对Function computer的了解,我们可以发现Function computer它其实就是在传统的编程语言的基础之上,增加了一个事件驱动的编程模型,虽然这相对于编程语言只是做了很小的一部分,就是加了一个小的变成驱动这样一个机制,但是它却是设计思想上的一个很大的提升,它让开发者不需要关心底层的实际执行,后面我们随着后面的学习,我们可以再进一步再分析。
二,Serverless
1,Function computer它其实是serverless的一种实现形式。
所以讲 Function computer,我们定会介绍一下分类,serverless 到底是什么?
其实在基础设施的发展经历了如下的几个阶段,在过去几十年,首先最早的时候是各个公司或者开发者他们自荐他们的数据中心,他们的服务器,这个时候他们部署这样一个服务环境的话,可能需要花很长的时间。
随着虚拟化技术和云计算技术的发展,我们逐渐发展出了各种虚拟机的技术,还有云技术,这使得我们的软件的部署效率在分钟级别了。那到前几年大火的容器技术更进一步的提升了我们的应用的开发部署效率,serverless 是在前面这些技术的基础之上,又一次技术的升级,它也可以被理解为叫做方式 serverless 就是 fast,它使得我们只需要去管理程序里面的函数,甚至不需要去管理程序。
其中最早的时候,自建叠加 container 我们不仅要去管理硬件系统,软件,我们还要去负责我们程序内部的各方面的事情。云计算技术,
其实已经不需要我们再自建机房了。
在容器时代,我们甚至连硬件之上的系统软件都不需要维护了,我们只需要维护我们自己的应用程序。在 serverless 的历史时代,我们连程序所在的进程都不需要维护了,我们只需要维护进程里面的函数片段。
2,传统的laaS和Paas
其实我们会去考虑很多东西,开发者的负担非常大,譬如说缓存、数据库、存储、计算资源、消息服务、应用服务器,还有性能优化、横向扩展、负载均衡、容灾,这个对于创业公司,还有对于普通的个人开发者,都是很大的开发成本,会极大的阻碍开发效率的提升。serverless 架构它其实提供了一种碎片化的软件架构,有时候我们也把它称作是 Faas。
函数它提供的其实是相比微服务更加细小的程序单元,比如我们可以有一个微服务,然后来执行所有的增删改查所需要的操作,它可能是一个进程,但是在 Faas 里面,我们 Faas 的函数对应的就是所要执行的每一个操作,譬如是创建函数,读取函数,更新函数或者是删除函数,当然触发了创建账户这样的事件以后,通过函数的方式执行相应的函数。
所以函数或者是 serverless 相对于微服务来说,我们就把开发者关注的部分从程序级别提升到了程序内部的函数这样一个细小的程序单元上,那 serverless 或者是function computer 这样的概念,他这样做的为什么是可行的,其实他是对我们现在所写的应用的根本的一个抽象我们学C语言或者数据结构的时候,经常会看到一句话,就是程序等于数据加算法,其中的算法就是我们的函数片段,其实就是业务逻辑的载体,数据就是相关业务的输出,所以用函数和数据其实就能够把一个应用完全抽象出来了。
现实事件的模型里面除了这种顺序执行的这种程序之外,其实还有很多这种事件出发的这样一种函数,这样一种程序。如果我们只有函数和数据组成的这样一个程序,其实我们是没有办法表达像 gui 这种类型的程序的。
这个时候我们为了能够概括所有的应用,我们还会引入事件这样的概念,这样就能够把所有的应用抽象出来,其他的代码我们都可以把它理解成胶水代码,所以serverless 或者是函数计算它的核心思想就是让开发人员更多的 focus 在业务逻辑上核心业务上而不是在这些胶水代码或者是基础设施的运维管理上面。
我们来看一下函数计算整个的一个模型,事件驱动模型,首先会有试验员,世界里面产生一个事件的时候,它会触发或者是调用我们函数计算中的一个函数,那函数计算框架就会去执行这个函数,它可能会在它的管理的集群的任何一台机器上去执行这个函数,然后能够自动的伸缩。
三,编程模型
那函数计算在link上面它承载着一个什么样的角色,是一个通用的编程框架,在link 这个场景里面它能做哪些事情呢?
1,首先它能够去操作设备,我们看这个函数。
这个函数能够对于我们的左侧的设备端进行操作。
2,其次我们编写的函数也能够去访问所有的云服务。
3,第三个,我们可以在这些函数中处理数据。
4,第四个,我们可以看到函数之间能够互相的串联,其实他们是函数间的互相调用,我可以用一个函数去调另一个函数,这跟我们在编程语言里面的函数互调是非常类似的。在 Link lo T edge 里面,其实我们的函数计算还持续运行,持续运行其实很像我们的普通的程序进程,
也就是说在边缘计算的场景里面,我们不仅有事件驱动的编程模型,我们还有普通的程序执行的模型,然后函数计算还是一个支持多语言的框架,能够支持任意的业务逻辑。可能就很好奇到底函数函数怎么写,我们来看一下函数的编程模型,
module.exports.handler=function(event,context,callback){}
首先函数的入口就是一个入口文件里面有一个handler这样的函数,那它会有三个参数,第一个是 event,event 就是在函数被触发,或者是被调用执行的时候,由调用者或者是事件源传进来的数据,倘若计算框架会把这个数据原封不动的传到函数里面,在函数里面就能够拿到这个事件的相关信息。
第二个是context,横txt是函数的一些运行时信息,比如这个函数被触发的时候,函数计算框架会这一次事件生成一个请求的 ID,request ID,这个 request ID 会最终会在 context 这个参数里面传给函数,或者我们还有一些其他的运行时信息,譬如我们这个函数运行的时候可能会配置了相应的访问云服务的权限,通过context,可能我们就可以拿到这些权限。
还有我们的一些函数本身的一些语言信息,譬如说我的函数运行的内存大小等等这样一些运行时的信息,框架会将函数运行的一些上下文信息通过context这个参数传给函数。
5,最后一个是 callback,这个是特有的返回值机制。所以我们看到在这函数里面,我们通过event来作为这个函数的输入,然后通过返回值来作为这个函数的输出,也就是说函数的输入输出已经有了,函数的处理逻辑就在函数里面,这样他就能够服务于我们立刻 Link lo T edge 里面的计算需求,计算一定是有输入输出,一定是有计算逻辑的处理。
6,Python编程模型
我们再来看一下 Python 的编程模型,我们看到 Python 的编程模型里面没有一个callback,其他的其实都是一样的。
那Python里面它其实是通过handler的返回值直接作为函数的返回值,那函数计算Function Compute@Cloud。有哪些差异,其中最大的一个差异就是边缘上的函数计算,或者说Link lo T edge的函数计算,它支持弄内部模式,持续执行模式,持续执行模式它有什么特点呢?
(1)首先函数在部署或者在系统启动后,它会立即被加载,这样一个操作,也就是说当你的函数从云上被部署到边缘端的时候,如果你的这个函数是或者说是持续执行的,你的入口代码就会被 require,那对应的 Python 就是 import,对应的Java就是你的 SETI 代码块会被执行。
(2)第二个特点,函数异常退出时,系统会重新加载函数,这里的加载第一点的加载是一样的,还有一个特点,就是我们在 handle 函数之外的值,在两次函数调用时间是能够共享的。也就是说我第一次这个函数被触发时,我在 handle 之外有一个变量是一,我在函数里面把这个值变成了二,在下一次这个函数被触发的时候,我能拿到这个值,它是二,也就是上一次函数执行的值在下一次是能够看到的,我们说了通用的编程框架会有一个很重要的东西,SDK或者说是library Link lo T edge上的编程框架也会有SDK,它是由我们的函数计算框架和我们的 Link lo T edge 和SDK组成。Link lo T edge目前的API主要分成两大块,第一块是 IoT 相关的操作,第二块是函数相关的操作,那函数参观的操作比较简单,主要是一个 invoke 方式的接口,就是我一个函数可以去掉另一个函数,IoT 相关的操作,也就是C相关的操作也不多,我们可以看到比较常规的像获取属性,根据 params 来获取C相关的信息,然后还有我们的publish消息的接口。
四,例子
最后我们再来看一个例子,这个例子其实就是我们函数计算Link lo T edge。
快速入门里面的一个事例。先看一下我们的文档,找到物联网的边缘计算,在快速入门里面,我们能看到这样一个例子,这个例子主要有两个设备跟一个函数来组成,拿到这样一个设备,它在启动之后,它会将光照度值不断的上报到Link lo T edge。
然后在 Link lo T edge 上面运行了一个框架编写的函数,这个函数里面它会判断关照度传感值,它会去监听关照度值,但这个值大于500或者它是它小于等于0的时候,它就会去分别的关和开灯。这个代码,在 get up 上面我们也可以看到。
来看一下这个事例里面,我们把 Link lo T edge 的SDK引入进来了,然后我们创建了相关一个实例。
我们再来看我们的入口函数,我们通过解析event,拿到它里面的光照度的值,最后我们来判断光照度的值,但它大于500的时候,我们就掉 turn off,但它小于100的时候,我们就通过我们再来看一下turn off。
Turn off其实就是设置了物的属性,把一个和大家的 key 和 devastating 指定的物的拿着 switch 这样一个属性设成了0。Tone刚好相反,他把 product key 跟devastating 标识的这样一个属性设成了1,这样就把这个灯打开了。
所以这就是我们函数计算在 Link lo T edge 上面编写的一个很简单的应用。