赞
踩
说明:文章内容来自网络文章的整理和翻译以及ATA文章知识的汇总,知识点及数据具体出处见参考部分
云计算的发展在经历了IaaS(Infrastructure as a Service-基础设施即服务),PaaS(Platform as a Service-平台即服务),SaaS(Software as a Service-软件即服务)几个阶段后,Serverless(无服务器化)趋势越发明显,时至今日,无服务器计算(Serverless Computing)作为云原生计算模型的应用也日臻完善,相关产品也是各云厂商竞相角逐的战场。
从CNCF Serverless Landscape中看出,Serverless落地产品形态一般分为如下三类:
截至2018年12月Google Trends 的结果所示,“Serverless”的搜索量在过去三年中增加了近 20 倍。
"RightScale 2018 State of the Cluoud Report" 中指出Serverless是增长最快的扩展云服务,不仅在基本计算、存储和网络服务领域,即使在最流行的扩展服务、关系数据库、推送通知和缓存中仍保持在前三位
相比于2017年Serverless的年增长率达到了75%,已经超过了Container-as-aservice(容器即服务),位列第一
The New Stack 的一份报告中的付费调研也指出,78%的参与者表示他们将在未来几个月内使用或计划使用 Serverless 技术。
云原生计算基金会CNCF(Cloud Native Computing Foundation, CNCF)Serverless Whitepaper v1.0对无服务器计算作了如下定义:
Serverless computing refers to the concept of building and running applications that do not require server management. It describes a finer-grained deployment model where applications, bundled as one or more functions, are uploaded to a platform and then executed, scaled, and billed in response to the exact demand needed at the moment.
无服务器计算(Serverless Computing)是指在构建和运行应用时无需管理服务器等基础设施。它描述了一个更细粒度的部署模型,在该模型中,应用被拆解为一个或多个细粒度的函数被上传到一个平台,然后根据当前所需执行、扩展和计费。
无服务器计算并不意味着我们不再使用服务器来承载和运行代码,也不意味着不再需要运维工程师。而是指无服务器计算的消费者不再需要花费时间和资源在服务器配置、维护、更新、扩展和容量规划上。所有这些任务和功能都由无服务器平台处理,并且完全从开发人员和IT/操作团队中抽象出来。因此,开发人员专注于编写应用程序的业务逻辑。运营工程师能够将他们的重点提升到更关键的业务任务上。
无服务器计算平台可以提供以下一种或两种服务:
无服务器计算(Serverless Computing)应用利弊大致如下:
Pros:
Cons:
CNCF白皮书对于无服务器框架中的函数用法,函数约束、生命周期、调用类型和所需的抽象等定义了规范,以便同一个函数可以一次性编码,并在不同的无服务器框架中使用。
FaaS解决方案概括为具有以下图中所示的几个关键元素:
无服务器函数定义可以包含以下规范和元数据,函数定义是特定于版本的:
一些无服务器框架允许用户指定函数使用的输入/输出数据资源,这使开发人员能够简化、提高性能(在执行之间保留数据连接,可以预取数据等)和更好的安全性(数据资源凭据是上下文的一部分,而不是代码)。
绑定数据可以是文件、对象、记录、消息等形式,函数规范可以包括一组数据绑定定义,每个定义指定数据资源、其凭证和使用参数。数据绑定可以引用事件数据(例如,db键是从事件“用户名”字段派生的),示例:https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings
函数和无服务器运行时应该满足的通用需求:
根据不同的用例,可以从不同的事件源调用函数,例如:
函数生命周期:
无服务器框架可能允许以下操作和方法定义和控制功能生命周期:
关键步骤说明:
不同类型的事件源包括:
函数是由事件源触发的事件调用的。函数和事件源之间有一个n:m映射。每个事件源可以用来调用多个函数,一个函数可以由多个事件源触发。事件源可以映射到函数的特定版本或函数的别名,后者提供了更改函数的方法,并部署了一个新版本,而不需要更改事件关联。事件源也可以定义为使用同一函数的不同版本,定义应为每个函数分配多少流量。
在创建了一个函数之后,或者在以后的某个时间点,需要将事件源关联起来,该事件源应该作为该事件的结果触发函数调用。这需要一组操作和方法,例如:
函数输入包括事件数据(event data)和元数据(metadata),并且可以包括一个上下文对象(context object)。
事件详细信息应传递给函数处理程序,不同的事件可能具有不同的元数据,因此函数需要能够确定事件的类型并轻松解析通用和特定于事件的元数据。
将事件类与实现分离是可取的,例如:处理消息流的函数将工作相同,而不管流存储是Kafka还是Kinesis。在这两种情况下,它都将接收消息体和事件元数据,消息可以在不同的框架之间路由。
事件可以包括单个记录(例如,在请求/响应模型中),或者接受多个记录或微批(例如,在流模式中)。
FaaS解决方案使用的常见事件数据和元数据示例:
事件/记录特定元数据的示例:
事件源结构示例:
有些实现将JSON作为向函数传递事件信息的机制来关注。这可能会增加高速函数(例如流处理)或低能耗设备(IOT)的大量序列化/反序列化开销。在这些情况下,将本机语言结构或其他序列化机制视为选项可能是值得的。
当调用函数时,框架可能希望提供对跨多个函数调用的平台资源或常规属性的访问,而不是将所有静态数据放在事件中,或强制函数在每次调用时初始化平台服务。
上下文作为一组输入属性、环境变量或全局变量传递。有些实现使用这三种方法的组合。
上下文示例:
一些实现使用日志对象初始化日志对象(例如,作为AWS中的全局变量或Azure中的部分上下文),用户可以使用集成平台工具跟踪函数执行。除了传统的日志记录之外,未来的实现可能会将计数器/监视和跟踪活动抽象为平台上下文的一部分,以进一步提高功能的可用性。
数据绑定作为函数上下文的一部分,平台根据用户配置启动到外部数据资源的连接,这些连接可以在多个函数调用中重用。
当函数退出时,它可以:
应该有一种确定的方法来知道函数是否通过返回的错误值或退出代码成功或失败。
函数输出可以是结构化的(如HTTP响应对象)或非结构化的(如某些输出字符串)。
用户需要一种方法来指定他们的无服务器用例或工作流。例如,一个用例可以是“在照片上传到云存储时在照片上进行人脸识别(发生照片存储事件)。”另一个物联网用例可以是“在接收到运动检测事件时进行运动分析”,然后根据分析功能的结果,或者“触发房屋警报并调用e警察部门“或只是”将运动图像发送给房主。“有关详细信息,请参阅用例部分。
AWS提供“步骤函数”(step function),供用户指定其工作流,但步骤函数不允许指定触发工作流中哪些函数的事件/事件。
下图是涉及事件和函数的用户工作流的示例。使用这种函数图,用户可以轻松地指定事件和函数之间的交互,以及如何在工作流中的函数之间传递信息。
功能图状态包括:
状态和相关信息需要保存在一些持久存储中,以便进行故障恢复。在某些用例中,用户可能希望将来自一个状态的信息传递到下一个状态。这些信息可以是函数执行结果的一部分,也可以是与事件触发器关联的输入数据的一部分。需要在每个状态定义一个信息过滤器,以过滤出需要在状态之间传递的信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。