Apache OpenWhisk 如何按事件执行函数?

Apache OpenWhisk 是一个开源的无服务器云平台,核心行为是:在事件发生时执行函数,并按规模自动调度。你不需要自己管理服务器,只需把函数代码和触发规则交给平台,事件一到,平台负责运行与扩展。它适合事件驱动、负载波动大、希望按执行而非按机器计费的场景;如果你的任务需要长时间常驻进程或对底层环境有强控制需求,则不适合。

事件驱动执行的基本流程

OpenWhisk 的模型可以拆成四个角色:

  • Action(动作):你写的函数代码,是实际被执行的单元。
  • Trigger(触发器):代表一类事件,比如一次 HTTP 请求、一条消息到达。
  • Rule(规则):把 Trigger 和 Action 关联起来,声明“当这个事件发生,执行那个函数”。
  • Feed(事件源):把外部系统的事件接入 Trigger,例如消息队列、定时器或 Webhook。

一次典型执行按以下顺序发生:

  1. 外部系统产生事件,Feed 将其投递到对应的 Trigger。
  2. Trigger 被触发后,匹配到关联的 Rule。
  3. 平台根据 Rule 调用目标 Action。
  4. Action 在平台管理的运行环境中执行,返回结果。
  5. 平台按需创建或回收执行资源。

关键点在于:你只声明“什么事件触发什么函数”,不声明“在哪台机器上跑、跑几个实例”。调度和扩缩由平台完成。

为什么不需要管理服务器

传统部署里,你要先准备服务器或容器,再考虑进程常驻、健康检查、扩容阈值。OpenWhisk 把这层抽象掉了:

  • 函数只在被触发时运行,空闲时不占用你管理的实例。
  • 平台根据事件量决定并发执行的数量。
  • 执行环境由平台提供,你交付的是函数本身。

这带来两个直接结果:一是运维面变小,二是计费与资源模型通常围绕“执行”而非“常驻机器”。具体计费方式取决于你使用的部署或托管服务,官网本身未给出价格信息,需要以实际提供方为准。

一个具体例子

假设你要在图片上传后生成缩略图:

  • 事件源:对象存储的“文件上传”通知。
  • Trigger:接收到上传事件。
  • Rule:把该 Trigger 绑定到 makeThumbnail 这个 Action。
  • Action:读取图片、生成缩略图、写回存储。

用户上传一张图片,事件到达,函数被调用一次;同时上传一千张,平台就按需并发执行,你不需要提前扩容,也不需要在上传结束后手动缩容。

适合与不适合的场景

场景特征 是否适合 原因
事件触发、执行时间短 适合 与事件驱动模型天然匹配
负载波动大、有明显峰值 适合 平台按需调度与扩展
不想管理服务器 适合 执行环境由平台负责
长时间常驻进程 不适合 模型以事件触发的函数执行为主
需要强底层控制 不适合 抽象层减少了环境控制能力

上手前需要确认的事

  • 你的事件源是否能通过 Feed 接入,或能否用 HTTP 触发。
  • 函数是否有执行时长和资源上限要求,是否落在平台允许范围内。
  • 你使用的是自托管 OpenWhisk 还是某个托管服务,两者的部署、配额和计费方式不同。
  • 官网定位是“开源无服务器云平台”,开源意味着可自行部署,但自托管需要你承担集群运维,这与“无需管理服务器”的托管体验不是一回事,选择时要区分。
openwhisk.apache.org