DurableObjectStub 接口是用于调用远程 Durable Object 方法的客户端。DurableObjectStub 的类型是泛型的,以允许在 stub 上调用 RPC 方法。
Durable Objects 实现 E-order 语义,这一概念源自 E 分布式编程语言 ↗。当您对同一 Durable Object 进行多次调用时,保证调用按您发起的顺序传递给远程 Durable Object。E-order 语义使许多分布式编程问题更容易解决。E-order 由 Cloudflare Workers 用于内部通信的 Cap'n Proto ↗ 分布式对象能力 RPC 协议实现。
如果 Durable Object stub 抛出异常,所有进行中的调用和未来调用都将因异常而失败。要继续调用远程 Durable Object 的方法,Worker 必须重新创建 stub。不同 stub 之间没有顺序保证。
import { DurableObject } from "cloudflare:workers";
// Durable Object
export class MyDurableObject extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
}
async sayHello() {
return "Hello, World!";
}
}
// Worker
export default {
async fetch(request, env) {
// stub 是用于调用 Durable Object 上方法的客户端
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
// Durable Object 上的方法是通过 stub 调用的
const rpcResponse = await stub.sayHello();
return new Response(rpcResponse);
},
};import { DurableObject } from "cloudflare:workers";
export interface Env {
MY_DURABLE_OBJECT: DurableObjectNamespace<MyDurableObject>;
}
// Durable Object
export class MyDurableObject extends DurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
async sayHello(): Promise<string> {
return "Hello, World!";
}
}
// Worker
export default {
async fetch(request, env) {
// stub 是用于调用 Durable Object 上方法的客户端
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
// Durable Object 上的方法是通过 stub 调用的
const rpcResponse = await stub.sayHello();
return new Response(rpcResponse);
},
} satisfies ExportedHandler<Env>;id 是 DurableObjectStub 的属性,对应于用于创建 stub 的 DurableObjectId。
const id = env.MY_DURABLE_OBJECT.newUniqueId();
const stub = env.MY_DURABLE_OBJECT.get(id);
console.assert(id.equals(stub.id), "This should always be true");id = env.MY_DURABLE_OBJECT.newUniqueId()
stub = env.MY_DURABLE_OBJECT.get(id)
assert id.equals(stub.id), "This should always be true"name 是 DurableObjectStub 的可选属性,如果在创建 stub 时提供了名称(直接通过 DurableObjectNamespace::getByName 或间接通过 DurableObjectNamespace::idFromName 创建的 DurableObjectId),则返回该名称。如果用于创建 DurableObjectStub 的 DurableObjectId 是使用 DurableObjectNamespace::newUniqueId 构造的,则此值为 undefined。
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
console.assert(stub.name === "foo", "This should always be true");stub = env.MY_DURABLE_OBJECT.getByName("foo")
assert stub.name == "foo", "This should always be true"