ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

celld JS RPC零基础教程:DO方法、回调、Promise流水线一次讲透

celld JS RPC零基础教程:DO方法、回调、Promise流水线一次讲透 celld JS RPC零基础教程DO方法、回调、Promise流水线一次讲透【免费下载链接】celldself-hosted, distributed Durable Objects项目地址: https://gitcode.com/GitHub_Trending/ce/celldcelld 是一个自托管的分布式 Durable Objects 运行时本教程带你零基础掌握它的JS RPC直接调用 Durable Object 方法、传递回调函数、以及 Promise 流水线式调用。读完即可看懂官方 examples/rpc 示例的全部 7 个路由。一、JS RPC 是什么为什么你需要它传统调用 Durable ObjectDO要拼 URL、发fetch()请求、解析 JSON——繁琐且低效。JS RPC 让你像调本地对象一样远程调用const account env.ACCOUNT.getByName(acct-1); const balance await account.deposit(10); // 直接在对象上调用方法没有fetch()、没有 URL、没有 Request。参数和返回值通过结构化克隆structured clone传输这就是 celld 内置的 Workers 运行时能力兼容性与 Cloudflare 对齐见 docs/cloudflare-compat.md 的 RPC 一节。二、三个关键概念一次看懂 RPC 的本质概念一句话解释对你的意义结构化克隆参数/返回值必须可克隆普通对象、数组、Promise 等DO 方法只收可克隆的值桩stub无法克隆的值函数、类实例不传本体只传一个句柄回调、流水线全靠它隔离区isolate每个 DO 是独立的 V8 isolatecelld 中 stub 不能跨 isolate核心心智模型调用一个远端对象的方法 把方法调用本身打包送过去执行然后拿回结果。桩就是替身它记住代码住在哪边调用它时会回到代码所在地执行。三、第一个调用DO 方法怎么暴露在 DO 类里写普通方法即可前提是super(state, env)——它是让方法可被远程访问的开关完整代码见 examples/rpc/index.jsexport class Account extends DurableObject { constructor(state, env) { super(state, env); // 关键方法因此可被 RPC 到达 this.state state; } async deposit(amount) { const balance (await this.state.storage.get(balance)) ?? 0 amount; await this.state.storage.put(balance, balance); return balance; } }注意 celld 的一条重要限制每个 DO 都是自己的 isolate而 stub 还不能跨越 isolate 边界docs/cloudflare-compat.md。所以✅ DO 方法只能接收/返回可克隆的值❌ 给 DO 方法传函数、从 DO 方法返回RpcTarget会直接抛出RPC stubs cannot cross isolate boundaries yet这条限制决定了你设计 API 的形状回调、RpcTarget、Promise 流水线都走ctx.exports同一 isolate 内跨 isolate 只走可克隆值的普通方法调用。四、回调把函数当参数传函数无法克隆它会以桩的形式到达对端——被调用方拿到的是句柄调用句柄时代码会回到发起方执行见 examples/rpc/index.js// 被调方Ledger 是 WorkerEntrypoint与 fetch 同 isolate async tally(values, onEach) { let total 0; for (const value of values) { total value; await onEach(value, total); // onEach 是桩调用跳回发起方 } return total; }发起方只需把普通函数传进去const steps []; const total await ctx.exports.Ledger.tally([1, 2, 3], (v, running) { steps.push({ v, running }); // 这段逻辑在我这边跑 });应用场景分批处理时逐项上报进度、流式聚合、计算在远端、副作用留在本地的场景。五、回调工厂与 RpcTarget返回值也能活着函数作为返回值时同样变成桩。一个方法返回函数等于给调用方发了一张回调券examples/rpc/index.jsadder(left) { return (right) left right; // 返回的函数 桩 } // 调用方 using addFive await ctx.exports.Ledger.adder(5); const sum await addFive(37); // 每次调用都跳回 entrypoint 执行RpcTarget则更进一步普通类根本不能过 RPC继承RpcTarget的类会以活对象形式跨端调用方还能在对象真正存在之前就链式调用它examples/rpc/index.js。using关键字负责在作用域结束时释放桩。六、Promise 流水线最快的一种 RPCRPC 调用返回的是Promise而桩可以在 Promise 还没兑现时继续调用方法——多个跳板一次性出发省掉串行等待examples/rpc/index.js// 注意 open() 没有 await const describe await ctx.exports.Ledger.open(acct-9, 7).describe(); // 两跳创建 Receipt → describe合并为一次往返比先 await 再调用快对比先 await 再调用流水线少一次网络/调度往返是批量操作链式处理时的提速利器。七、celld 的 RPC 能力边界选型前必读调用路径能力Worker → DO 桩跨 isolate普通方法调用参数/返回值须可克隆ctx.exports→ 命名 entrypoint同 isolate完整能力回调、RpcTarget、流水线、返回函数跨 isolate 的 service binding仅单次方法调用不支持fetch()、可 await 属性和流水线来源docs/cloudflare-compat.md 的 RPC 小节。设计口诀有状态的走 DO 方法可克隆值复杂的交互走同 Worker 内的命名 entrypoint。八、跑起来部署官方 rpc 示例示例工程用 examples/rpc/wrangler.jsonc 声明了ACCOUNTDO 绑定与 SQLite 迁移部署只需一条命令前提PATH 中有 esbuildcelld deploy examples/rpc --bucket s3://my-cells-bucket然后依次请求 7 个路由每个对应一种 RPC 能力路由演示的能力/depositDO 桩上的方法调用/deposit-many跨 isolate 的可克隆值批量调用/entrypointctx.exports到达同 Worker 的命名 entrypoint/adder返回函数回调工厂/callback函数参数作为桩被回调/receiptRpcTarget活对象 using释放桩/pipelinePromise 流水线两跳合一九、总结零基础记住这 4 点DO 方法即 RPC 接口extends DurableObjectsuper(state, env)方法直接可远程调用能克隆的传值不能克隆的传桩函数和RpcTarget实例都走桩桩不能跨 isolatecelld 中 DO 方法只做可克隆值的调用复杂交互留在ctx.exports同 isolate 面Promise 不 await 就能链这是 JS RPC 独有的流水线优化想继续深入建议阅读 examples/rpc/index.js每个路由都有注释和 docs/README.md 了解 cell 的驻留/休眠机制——RPC 调用会让 cell 激活空闲后自动休眠成本趋近于零。【免费下载链接】celldself-hosted, distributed Durable Objects项目地址: https://gitcode.com/GitHub_Trending/ce/celld创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表