Apache OpenWhisk

本文基于 Apache OpenWhisk 71b7d564ff60bf6e89be5410ffcf59f785d17a4a 版本。因为对 scala 并不熟,这个项目就简单介绍一下

架构

图片来源

OpenWhisk 复用了社区的 Nginx, Kafka, Docker, CouchDB 组件,新增了 Controller 和 Invoker 组件

这里给出一个简单的 demo:

  • 用户编写函数代码

      function main() {
          console.log('Hello World');
          return { hello: 'world' };
      }
  • 创建 action

      wsk action create myAction action.js
  • 触发 action

      wsk action invoke myAction --result

create 是一个简单的 crud,下面结合架构图,来说一下 invoke 的工作流:

  • wsk action invoke 命令向 nginx 发起了一个 http 请求

  • nginx 转发请求到 controller

  • controller 完成 request 的认证,并从 couchDB subjects 数据库获取信息完成鉴权

  • 鉴权通过后,controller 从 couchDB whisks 数据库获取 action 信息

  • controller 包含 Load Balancer 模块,它检查系统中所有 executor(称为 Invoker)的健康状况,获悉全局可用 invoker,发送信息到 kafka

  • invoker 获取 message,kafka 返回 activationID 给用户(异步)

  • invoker 启动 docker 容器,注入 action 代码,执行完后,将结果存储到 couchDB activations 数据库

  • invoker 销毁容器

参考文档:

概念

上文中提到了 action 等一些概念,本节会系统性的介绍 OpenWhisk 中的主要概念

  • Namespace:namespace 是 OpenWhisk 组织资源对象的方式,像 actions, triggers, 和 rules 都归属于某一个 namespace

  • Package:和 namespace 类似,一个 namespace 可以包含多个 package。对 actions 等对象来说,可以归属 package 也可以不归属。package 的主要作用是共享和复用,例如 /whisk.system/github 就包含了对 github webhook 的支持。具体内容可参考 Using and creating OpenWhisk packages

  • Action:action 就是用户定义的函数。支持多种语言,支持同步、异步调用,还可以控制 action 调用链顺序。借助 wsk 命令行可以方便的编写、触发、更新函数。具体内容可参考 OpenWhisk Actions

  • Trigger & Rule:通过 wsk action invoke 可以触发 action,但一般在生产环境,需要通过 trigger 和 rule 来触发。其中,trigger 由 feed 触发,rule 则绑定 trigger 和 action。具体内容可参考 Creating triggers and rules

  • Feed:feed 是触发函数的事件源,OpenWhisk 支持三种 feed:Hooks, Polling 和 Connections。Hooks 指由一个 webhook 触发,如 github 提交代码;Polling 指靠 action 去主动轮询;Connections 则是指另起一个服务,它来关注事件源,在获取事件后,主动通知 OpenWhisk。具体内容可参考 Implementing feeds

其它

OpenWhisk 还支持用户自定义自己的 runtime,具体内容可参考 Developing a new Runtime with the ActionLoop proxy

Last updated