开源FaaS平台(二):Apache OpenWhisk

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: Apache OpenWhisk是一个开源FaaS平台,是一个由IBM和Adobe驱动的开源项目,可以部署在云或数据中心内。相比其他Serverless项目,OpenWhisk是一个健壮的、可扩展的平台,支持数千并发触发器和调用。OpenWhisk项目的基本信息如下表

Apache OpenWhisk

Apache OpenWhisk是一个开源FaaS平台,是一个由IBM和Adobe驱动的开源项目,可以部署在云或数据中心内。相比其他Serverless项目,OpenWhisk是一个健壮的、可扩展的平台,支持数千并发触发器和调用。OpenWhisk项目的基本信息如下表

授权协议

Apache

开发厂商

IBM

开发语言

Scala

发布时间

2016年(InterConnect 2016

操作平台

跨平台

Github Star/Fork

3968/764

提交次数

2499

Github地址

/openwhisk/openwhisk


Apache OpenWhisk是一个事件驱动型代码执行的Faas平台,同时该项目也是一个云优先的、分布式的的编程服务。建立在开源软件之上的它,为用户提供了一个编程模型,可将事件处理程序上传到云服务并注册该处理程序来响应各种事件。

工作原理

由于Apache OpenWhisk使用容器构建组件,因此很容易在本地和云基础设施中支持许多部署选项。选项包括许多当今流行的容器框架,如Kubernetes和OpenShift、Mesos和Compose。一般来说,社区支持使用Helm charts在Kubernetes上部署,因为它为开发人员和操作人员提供了许多简单方便的实现方法。除此之外,OpenWhisk所支持的Runtime也是非常丰富的,一方面有相对标准的语言环境,如NodeJS、Go、Java、Scala、PHP、Python、Ruby和Swift、. net和Rust等语言,另一方面也有一些相对定制化的Runtime,例如以Python语言为例,其Action包括Python2Action、Python3AiAction、PythonAction以及pythonActionLoop等。Python2Action使用的是2.7版本,内置了flask、bs、以及kafka_python、scrapy、requests等多种常用的依赖。Python3AiAction则基于Python3,内置了Tensoflow、Pytorch等众多人工智能所需要的框架等。另外OpenWhisk还是一个“建立在开源项目之上的项目”,OpenWhisk与多种流行服务集成,一方面是该项目内部集成了众多开源产品,例如Nginx,Kafka等,这些主流的开源框架集成,一方面保证了产品功能的完整性,另一方面也保证了产品功能组成可以更好的被使用者理解;通过不同开源框架和产品的融合,OpenWhisk形成了一套独有且完整的Serverless解决方案,除了容易调用和函数管理,Openwhisk还包括了身份验证/鉴权、函数异步触发等功能。另一方面,该项目可以在用户使用的过程中集成各类流行服务,例如其原文中的描述: Packages offer integrations with general services such as Kafka message queues, databases including Cloudant, Push Notifications from mobile applications, Slack messaging, and RSS feeds. Development pipelines can take advantage of integrations with GitHub, JIRA, or easily connect with custom data services from IBM Watson for Translation or Speech-to-Text, as well as the Weather company. 除此之外OpenWhisk具有极强的拓展性,在OpenWhisk官网中,有这样的描述:Run your action ten thousand times in a fraction of a second, or once a week. Action instances scale to meet demand as needed, then disappear. Enjoy optimal utilization where you don't pay for idle resources. 我们可以看到OpenWhisk是具有一定的自动伸缩能力(即自动扩缩容能力),可以非常节约资源的面临小规模请求,也可以比较高性能的面临大规模并发请求。

在OpenWhisk的整体流程图中可以看到其包括了Nginx, Controller以及CouchDB,Consul以及Kafka,Invoker等组件。其中Nginx的作用是暴露HTTP/HTTPS接口给客户端。Controller 充当系统的守门员、系统的协调者,它将决定请求即将流转的路径。CouchDB 主要是管理系统的状态。Consul 作为系统每个组件可访问的单一数据源。同时,Consul还提供服务发现功能,使Controller发现调用操作的实体。Kafka 用于构建实时数据管道和流应用程序。Invoker 使用 Scala语言实现,它是处理执行过程的最后阶段。整个项目的流程大致可以简化为:

(1)Nginx Openwhisk面向用户的API完全基于HTTP/HTTPS,遵循Restful设计,因此,通过wsk-cli发送的命令本质上是向其发送HTTP/HTTPS请求,上面的命令大致可以翻译为:

POST /api/v1/namespaces/$userNamespace/actions/myAction

Host: $openwhiskEndpoint

 此处的Nginx主要用于接受HTTP/HTTPS请求,并将处理后的HTTP/HTTPS请求直接转发给Controller

(2)控制器:Controller Controller是真正开始处理请求的地方。Controller使用Scala语言实现,并提供了对应的Rest API,接受Nginx转发的请求。Controller分析请求内容,进行下一步处理。下面的很多个步骤都会和其有关系。

(3)身份验证和鉴权:CouchDB 用户发出的Post请求后,Controller首先需要验证用户的身份和权限。用户的身份信息(Credentials)保存在CouchDB的用户身份数据库中,验证无误后,Controller进行下一步处理。

(4)再次CouchDB,得到对应的Action的代码及配置 身份验证通过后,Controller需要从CouchDB中加载此操作。操作和记录主要要执行的代码和要传递给操作的默认参数,并与实际调用请求中包含的参数合并。除此之外,其还包含执行时对其施加的资源限制,例如允许使用的内存等。

(5)Consul和负载均衡 到了这一步,Controller已经有了触发函数所需要的全部信息,在将数据发送给触发器(Invoker)之前,Controller需要和 Consul 确认,从 Consul 获取处于空闲状态的Invoker的地址。Consul 是一个开源的服务注册/发现系统,在 OpenWhisk 中 Consul 负责记录跟踪所有Invoker的状态信息。当Controller向 Consul 发出请求,Consul 从后台随机选取一个空闲的Invoker信息,并返回。值得注意的是:无论是同步还是异步触发模式,Controller都不会直接调用触发器API,所有触发请求都会通过 Kafka 传递。

(6)发送请求进Kafka 考虑使用Kafka主要是担心发生以下两种状况:

  • 系统崩溃,丢失调用请求
  • 系统可能处于繁重的负载之下,调用需要等待其它调用首先完成。

Openwhisk考虑到异步情况的发生,考虑异步触发的情况,当Controller得到 Kafka收到请求消息的的确认后,会直接向发出请求的用户返回一个 ActivationId,当用户收到确认的 ActivationId,即可认为请求已经成功存入到 Kafka 队列中。用户可以稍后通过 ActivationId 索取函数运行的结果。Kafka通常用于构建实时数据管道和流应用程序。它支持高可靠、高速数据摄取的生产工作负载。OpenWhisk利用Kafka连接Controller和调用者。Kafka缓存由Controller发送的消息,然后再将这些消息传递给上节的Consul的调用者。当Kafka确认消息被传递时,Controller立即用激活ID进行响应。这种无状态架构使OpenWhisk具有高度可扩展性。 ZooKeeper维护和管理Kafka集群。Zookeeper的主要工作是跟踪Kafka群集中存在的节点的状态,并跟踪主题、消息和配额。

(7)Invoker运行用户的代码 Invoker从对应的Kafka Topic中接受Controller传来的请求,会生成一个Docker容器,注入动作代码,使用传递给他的参数执行它,获取结果,最后销毁容器。这一部分也通常是对整个项目优化的重点,例如通过大量性能优化以减少开销,或者通过池化等操作降低冷启动率,进而降低延时。

(8)CouchDB存储请求结果 Invoker的执行结果最终会被保存在CouchDB的whisk数据库中,格式如下所示:

{

   "activationId":"31809ddca6f64cfc9de2937ebd44fbb9",

   "response":{

       "statusCode":0,

       "result":{

           "hello":"world"

       }

   },

   "end":1474459415621,

   "logs":[

       "2016-09-21T12:03:35.619234386Z stdout: Hello World"

   ],

   "start":1474459415595

}

保存的结果中包括用户函数的返回值,及日志记录。对异步触发用户,可以通过步骤6中返回的 ActivationID 取回函数运行结果。同步触发的的结果和异步触发一样保存在 CouchDB 里,Controller在得到触发结束的确认后,从 CouchDB 中取得运行结果,直接返回给用户。

关于自动扩缩部分,在官方文档中并没有详细说明,但是在IBM团队的博客中,却追溯到了自动扩所容的影子。该标题是《验证 OpenWhisk 的自动伸缩特性 (Autoscale)》,文章内容是说,当创建 Action之后,再构造Web请求,当Web请求数为1时,OpenWhisk 启动了一个Container来处理;同时构造10个请求时,OpenWhisk 也会创建更多的 Container 来处理请求;并且文章最后表述OpenWhisk 通过自动申缩(AutoScale)功能可以很好的解决性能瓶颈。

功能与策略

冷启动

当对OpenWhisk源代码进行分析,对Invoker部分进行源代码的阅读,可以看到该过程分为:Uninitialized、Starting、Started、Running、Paused、Removing等几个部分。其中Uninitialized部分可能会有两个事件,分别是Start和Run,对于Start的描述为Pre warm a container (creates a stem cell container),对于Run的描述为Cold start (no container to reuse or available stem cell container),同时在源代码中也可以看到这样的描述:

A pool managing containers to run actions on. This pool fulfills the other half of the ContainerProxy contract. Only one job (either Start or Run) is sent to a child-actor at any given time. The pool then waits for a response of that container, indicating the container is done with the job. Only then will the pool send another request to that container.

Upon actor creation, the pool will start to prewarm containers according to the provided prewarmConfig, iff set. Those containers will **not** be part of the poolsize calculation, which is capped by the poolSize parameter. Prewarm containers are only used, if they have matching arguments (kind, memory) and there is space in the pool.

实际中OpenWhisk的启动过程可以粗略看为三部分:通过Docker run启动容器,并通过Docker inspect获取容器的IP地址。通过POST/init等操作初始化容器。通过POST/runDocker执行运行操作,启动新容器以运行操作。这个流程通过流程表示如下:

在整个策略中,有一个值得注意的事情是,OpenWhisk团队曾说,在第一次启动时,一定是冷启动,之后会通过温启动或者预热等操作进行函数调用,少了容器拉起的部分。

存储相关

CouchDb主要包括三个部分,Subjects、Whisks和Activations。Subjects主要存储用户验证信息等,Whisks存储了命名空间,Rules,Actions等信息,Activations存储了Activations等信息。KeyValue Store主要存储了Invoker等信息,包括服务和状态。

应用场景

官方给的OpenWhisk操作的事件触发器的一些示例包括:

  • 记录在数据库中的一次更改
  • 一个超出了某个温度的 IoT 传感器,GitHub 中的一次代码变更
  • 或者甚至是一个来自 Web 或移动应用程序的简单 HTTP 请求

非常适合 OpenWhisk 执行模型的一些用例包括:

  • 将应用程序分解为微服务:OpenWhisk 操作的可扩展模块化,使得它们能够有效地将负载密集型、可能很麻烦的(后台)任务从前端代码转移到云后端。
  • 移动后端:因为移动开发人员通常没有管理服务器端逻辑的经验,而只专注于在设备上运行的代码,所以 OpenWhisk 操作链很适合用作移动后端。
  • 数据处理:由于目前可用的数据过多,通常需要能够采用一种或另一种方式处理和应对新数据。这包括存储在记录中的结构化数据,以及文档、图像或视频处理。
  • 物联网:从很大程度上讲,物联网(IoT)场景实质上是传感器驱动的。例如,OpenWhisk 操作能够有效地响应超出特定温度的传感器
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
11天前
|
存储 人工智能 Serverless
AI 短剧遇上函数计算,一键搭建内容创意平台
为了帮助更多内容创作者和企业快速实现 AI 短剧创作,函数计算 FC 联合百炼联合推出“AI 剧本生成与动画创作解决方案”,通过函数计算 FC 构建 Web 服务,结合百炼模型服务和 ComfyUI 生图平台,实现从故事剧本撰写、插图设计、声音合成和字幕添加到视频合成的一站式自动化流程。创作者只需通过简单操作,就能快速生成高质量的剧本,并一键转化为精美的动画。
|
12天前
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
27天前
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ、Apache Seata 荣获 2024 开源创新榜单“年度开源项目”
近日,以“新纪天工、开物焕彩——致敬开源的力量”为活动主题的“重大科技成就发布会(首场)”在国家科技传播中心成功举办,并隆重揭晓了 2024 开源创新榜单,旨在致敬中国开源力量,传播推广开源科技成就,营造中国开源创新生态。2024 年开源创新榜单由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办,中国开发者社区承办,以王怀民院士为首组建评审委员会,进行研讨评审,面向中国开源行业领域,遴选具有创新性、贡献度和影响力的开源项目、社区、应用场景与开源事件。在评审出的 10 个年度开源项目中,Apache RocketMQ、Apache Seata 成功入选。
|
2月前
|
消息中间件 运维 安全
C5GAME 游戏饰品交易平台借助 RocketMQ Serverless 保障千万级玩家流畅体验
游戏行业蓬勃发展,作为国内领先的 STEAM 游戏饰品交易的服务平台,看 C5GAME 如何利用 RocketMQ Serverless 技术,为千万级玩家提供流畅的游戏体验,同时降低成本并提升运维效率。
160 17
C5GAME 游戏饰品交易平台借助 RocketMQ Serverless 保障千万级玩家流畅体验
|
2月前
|
运维 Cloud Native Serverless
Serverless Argo Workflows大规模计算工作流平台荣获信通院“云原生技术创新标杆案例”
2024年12月24日,阿里云Serverless Argo Workflows大规模计算工作流平台荣获由中国信息通信研究院颁发的「云原生技术创新案例」奖。
|
30天前
|
存储 SQL 监控
计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台
灵犀科技早期基于 Hadoop 构建大数据平台,在战略调整和需求的持续扩增下,数据处理效率、查询性能、资源成本问题随之出现。为此,引入 [Apache Doris](https://doris.apache.org/) 替换了复杂技术栈,升级为集存储、加工、服务为一体的统一架构,实现存储成本下降 60%,计算效率提升超 10 倍的显著成效。
计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台
|
3月前
|
消息中间件 监控 数据可视化
Apache Airflow 开源最顶级的分布式工作流平台
Apache Airflow 是一个用于创作、调度和监控工作流的平台,通过将工作流定义为代码,实现更好的可维护性和协作性。Airflow 使用有向无环图(DAG)定义任务,支持动态生成、扩展和优雅的管道设计。其丰富的命令行工具和用户界面使得任务管理和监控更加便捷。适用于静态和缓慢变化的工作流,常用于数据处理。
Apache Airflow 开源最顶级的分布式工作流平台
|
3月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
2月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
364 33
The Past, Present and Future of Apache Flink
|
4月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
983 13
Apache Flink 2.0-preview released

热门文章

最新文章