协议缓冲区中的远程对象句柄?

Remote object handles in Protocol Buffers?

Protocol Buffers 是否支持远程对象句柄?说支持像下面这样的 API:

service RemoteObjectsDemo {
    rpc AllocateRemoteObject() returns (RemoteObjectHandle);
    rpc UseRemoteObject(RemoteObjectHandle) returns (something);
    rpc FreeRemoteObject(RemoteObjectHandle) returns (Empty);
}

重点是,有时您只需要服务器上存在某个对象,但无需通过网络传输该对象。

因为 gRPC 和协议缓冲区与语言|运行时无关,并且因为没有对象句柄的通用概念,协议缓冲区不会公开 process-specific 对象引用。

另外,在很多情况下,不可能假设只有一个进程在执行 RPC; load-balancers 或其他 scale-out 机制会将流量定向到多个后端进程之一。

也就是说,gRPC 服务器可以跟踪代表共享资源(通常例如数据库|服务连接)的“事物”,并且没有理由不能将其也用于共享对象。

您需要考虑唯一标识对象(散列|字符串、整数)并在客户端和服务器之间共享此引用。

请记住,如果对象引用是 process-specific,您将无法 scale-out 服务器,因为 per-process 引用不能跨进程工作。

如果您要 return 一些数据库 ID,然后进行另一个调用并传入相同的 ID,以便以更多方式与相同的数据进行交互,那将可行。您只需查找一些状态并从中断处继续。通常,即使您进行负载平衡,应用程序也会连接到同一个数据库。

您可以通过执行一系列响应来与同一服务保持交互,如下所示:

rpc DoSomething(SomeRequest) returns (stream ManyResponses);

或者bi-directional流式传输。

rpc FindMax(stream FindMaxRequest) returns (stream FindMaxResponse) {};

您需要想出发送多少消息会引起多少响应的规则。再加上知道什么时候你会想要它。像上面一样,您可以一个接一个地发送值,然后每当检测到新的最大值时发送回响应。当您 运行 没有要发送的值时,您会执行 requestObserver.onComplete()。然后等待 StreamObserver 中的 onComplete() 事件指示的所有响应,也许有一个闩锁来同步响应和发送者。