阅读 336

用 Serverless Reactor 实现 Stateful 的函数—— 飞书机器人 serverless 实战

背景介绍:

这篇文章里讲到的 Stateful 函数是基于 Serverless Reactor 实现的。

Serverless Reactor 为开发者提供快速上线飞书上机器人的体验。只需将怎么从输入(发给机器人的消息)产生输出(机器人回复的消息)的逻辑写成一段代码函数,然后把函数上传到 Serverless Reactor 上,就可以轻松上线一个机器人应用。

Serverless Reactor 支持用当下最火的 Rust 语言写这样的函数。我们使用最简单的 Rust 语法就能完成一个机器人。你可以在玩转飞书机器人的同时轻松学习 Rust 编程!

Stateful 函数详解:

短版连续多步计算器.gif

从上面的,你已经发现了这个机器人应用能实现连续计算,也就是 Stateful 的函数。将公式 1+1,发送给机器人,机器人返还计算结果 2 ,还可以继续发送给机器人 +2 ,机器人则会返还 4 。

这篇文章就来告诉你,Serverless Reactor 如何实现 stateful 函数。

先来做个对比,之前我们分享过一个非常简单的机器人应用,只有 8 行代码。

// 简单的计算机器人
use wasm_bindgen::prelude::*;
use meval;

#[wasm_bindgen]
pub fn text_received(msg: String, _user_info: String, _step_data: String) -> String {
  let x = meval::eval_str(&msg).unwrap();
  return format!("{}", x);
}
复制代码

实现了连续计算的机器人应用与上文提到的简单机器人用了同样的 Rust 库,但是使用了 Serverless Reactor 封装的 step 函数。

// 连续多步计算器
use wasm_bindgen::prelude::*;
use meval;

#[wasm_bindgen]
pub fn text_received(msg: String, _user_info: String, step_data: String) -> String {
  if msg == "#" {
    return format!(r#"{{"new_step": true}}"#);
  } else {
    let exp = match step_data == ""{
      true => msg,
      _ => format!("({}){}", step_data, msg)
    };
    let x = meval::eval_str(&exp).unwrap();
    return format!(r#"{{"result": "{}", "step": "{}"}}"#, x, exp);
  }
}
复制代码

从这两个代码的对比,可以看出,连续多步计算机器人的 Rust 代码里明显多了很多 stepstep 可以保存应用任何一步的状态。这里的计算器程序保存的是上一步的计算公式,即(1+1),将计算公式用括号括起来。同一个用户再输入 *2 的时候,程序计算 (1+1)*2,然后计算结果。

Serverless Reactor 后端使用的是 WebAssembly (Wasm) 虚拟机 WasmEdge。 WebAssembly 程序本身是无状态的,因此 Serverless Reactor 设计了 step 来帮助保存之前函数的状态。

Serverless Reactor 每次调用 Wasm 函数时,函数都可以返回一个 step 值。如果应用需要保存上一步的状态,Reactor 就会保存 step, 在下次调用函数的时候回传给 Wasm 程序。如此就实现了让 Wasm 程序保存函数状态的目的,也就实现了 stateful 函数。

普通的计算机器人示例只是一问一答,不保存计算结果或计算公式,不需要 step

连续多步的机器人示例需要保存上一步的计算公式,因此这里就用到了 {"new_step": true}},来告知 Reactor ,让 Reactor 清空记忆,记住每次返回的 step ,并在后续的函数调用中使用之前的返回的 step。

有了 step,就可以用 serverless 的方式创建 stateful 函数,编写和机器人多次互动的程序。上文提到的多步计算器、处理图片、根据性别和生辰日期随机生成名字、天气预报应用(地点和日期)。

发布自己的机器人

与 Reactor 上的其他应用一样,Rust 代码写完后,就是使用 rustwasmc 将 Rust 代码编译成 Wasm 文件,上传到 Serverless Reactor 平台,并把生成的 service URL 提交给飞书详细步骤可以参考我们的入门文档《快速入门 Serverless Reactor》。

如果你也想搭建一个连续多步的计算器应用,完整代码在这里

文章分类
前端
文章标签