NodeGet worker的架构
NodeGet Worker = quickjs + llrt library + NodeGet extension / bind
NodeGet Worker是 NodeGet 嵌入的js运行时(runtime),其基础来自于quickjs项目。
选择quickjs而非v8引擎的原因是quickjs具有快速的启动时间和极小的内存足迹和打包体积,非常适合作为探针的嵌入式运行时。
同时为了在 js worker内方便调用 NodeGet 项目的接口,提供了名为 nodeget 的全局函数
为了支持标准js语法之外的扩展功能,借助了aws的llrt项目,补充实现了下面的模块
- fetch/Request/Response/Headers/FormData
- atob/btoa/TextEncoder/TextDecoder
- URL/URLSearchParams
- setTimeout/clearTimeout/setInterval
关于 NodeGet Worker 的详细能力扩展说明,可以参考API
此外,我们扩展了更多的调用入口,比如 onCall / onCron / onHttp / onInlineCall,使其能够和 NodeGet 项目无缝结合
export default {
// 通过 JSONRpc调用
async onCall(params, env, ctx) {
return { ok: true, from: "onCall", params, env };
},
// 通过 worker 相互调用
async onInlineCall(params, env, ctx) {
return { ok: true, from: "onInlineCall", params, env };
},
// 通过 cron、 JSONRpc调用
async onCron(params, env, ctx) {
return { ok: true, from: "onCron", params, env };
},
// 通过 http请求、 JSONRpc调用
async onRoute(request, env, ctx) {
return new Response("ok", { status: 200 });
}
};Worker 的调用关系
下面简单介绍下 Worker 支持的调用关系
api调用worker
通过 JSONRpc 发起 js-worker_run,可以执行 onCall 函数,为了方便开发调试,这个函数也支持模拟触发onCron、onRoute 并提供相关的 params 变量
worker 调用api
可以通过 worker 内的 nodeget函数,调用所有的 NodeGet接口,这个是跳过了 websocket 请求,直接触发对应的行为逻辑
虽然是没有网络数据包,但所需要的鉴权token并不会跳过,对于不同的api,仍然需要提供所需的token
worker只是行为,不代表权限。
worker 调用 worker
worker自建可以通过 inlineCall 入口相互调用,可以通过 ctx.inlineCaller 获得调用者并决定是否继续执行
http 路由绑定
worker可以绑定http路由,进而实现与外部系统交互,比如各种webhook,具体的应用如:
- telegram机器人可以完整部署到 NodeGet Worker 上
- GitHub更新的webhook
Worker的运行模式
下面是 NodeGet 在实现 worker 时采取的一些考量
- 每个 worker 的代码被更新时会预编译为字节码提高运行效率
- 一个worker对应一个runtime实例,worker间相互隔离
- runtime长时间不使用会被清理,可以设定每隔runtime的不活跃清理时间
- 每个worker储存他们自己的env变量,在函数运行时会被注入
