【发布时间】:2018-04-18 00:40:52
【问题描述】:
假设我们为 gRPC 开发了一个自定义的低级传输。我们如何将它“插入”到 gRPC c++ API 中以便我们可以将它用于 Channel?
【问题讨论】:
假设我们为 gRPC 开发了一个自定义的低级传输。我们如何将它“插入”到 gRPC c++ API 中以便我们可以将它用于 Channel?
【问题讨论】:
我正在编写一个文档,该文档很快就会出现在 https://github.com/grpc/grpc/,但这里有一个预览:
gRPC transports 插入到核心 API 之下(C++ API 之下一层)。你可以用 C 或 C++ 编写你的传输;目前所有的传输名义上都是用 C++ 编写的,尽管它们是惯用的 C。现有的传输是:
其中,进程内可能是最容易理解的,尽管也可以说与“真正的”基于套接字的传输最不相似。
在 gRPC 核心实现中,基本结构是 grpc_transport_stream_op_batch,它表示发送到传输的流操作的集合。批处理中的操作可以包括:
这些操作中的一个或多个被分组到一个批次中。应用程序可以在一个批次中启动所有调用的操作,也可以将它们分成多个批次。每个批次的结果通过完成队列异步返回。
在内部,我们使用回调来指示完成。表面层在开始新批次时创建回调,并将其与批次一起发送到过滤器堆栈。当批处理完成时,传输必须调用此回调,然后表面层通过完成队列向应用程序返回一个事件。每个批次最多可以有 3 个回调:
传输的工作是对基本流操作的各种可能的交错进行排序和解释。例如,批次的示例时间表是:
除了这些基本的流操作之外,传输必须随时处理流的取消并将其效果传递给另一端。传输必须执行诸如 ping 和统计之类的操作,这些操作用于塑造传输级别的特征,例如流量控制(例如,参见它们在 HTTP/2 传输中的使用)。
【讨论】:
关于 C++ API:大多数现有的自定义传输都是通过创建自己的凭据 C++ 类型来完成的,并使用这些凭据来启用新的传输。
【讨论】: