Second State 与 CSDN 合办的开源征文活动 还在进行中,快来参与投稿,就有机会获得 苹果新推出的 Airtag。
这篇文章里讲到的 Stateful 函数是基于 Serverless Reactor实现的。
Serverless Reactor 为开发者提供快速上线飞书上机器人的体验。只需将怎么从输入(发给机器人的消息)产生输出(机器人回复的消息)的逻辑写成一段代码函数,然后把函数上传到 Serverless Reactor 上,就可以轻松上线一个机器人应用。
Serverless Reactor 支持用当下最火的 Rust 语言写这样的函数。我们使用最简单的 Rust 语法就能完成一个机器人。你可以在玩转飞书机器人的同时轻松学习 Rust 编程!
从上面的图片,你已经发现了这个机器人应用能实现连续计算,也就是 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 代码里明显多了很多 step
。
step
可以保存应用任何一步的状态。这里的计算器程序保存的是上一步的计算公式,即(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》。
如果你也想搭建一个连续多步的计算器应用,完整代码在这里。