gpt4 book ai didi

c++ - 我应该共享 gRPC stub 还是 channel ?

转载 作者:太空狗 更新时间:2023-10-29 23:12:22 40 4
gpt4 key购买 nike

用于创建 channel 的 gRPC C++ API 返回一个 shared_ptr。生成的函数 NewStub 返回一个 unique_ptr。但是我见过reports of people having issues试图创建一个 stub 类型的多个实例,共享一个 channel 。他们的解决方案是共享 stub 。

从文档或 API 中不清楚客户端是要创建共享 channel 的多个 stub 实例还是共享单个 stub 。请阐明 stub 、 channel 和唯一客户端连接之间的概念关系。

再深入一点:服务器可以提供多个服务,而客户端端点可以使用单个 channel 将相应的 stub 类型连接到这些服务中的每一个。为此,很明显不同的 stub 类型共享同一个 channel 来与服务器端点对话。对于给定服务,gRPC 是否期望每个 channel 只有一个客户端,或者我可以在客户端端点上让多个客户端与单个服务通信吗?如果允许,我如何为客户端端点上的给定服务实现多个客户端?服务器如何区分这些独立的客户端?

顺便说一句,This SO post表示 Channels 和 Stubs 都是线程安全的。 (该帖子专门针对 Java,但我假设它适用于 C++)。

最佳答案

我认为首先我们需要根据 official documents 澄清 channelstub 的定义:

channel :

A gRPC channel provides a connection to a gRPC server on a specified host and port...

结论:一个 channel 代表一个 TCP 连接。

stub :

On the client side, the client has a local object known as stub (for some languages, the preferred term is client) that implements the same methods as the service.

结论: stub 代表单个客户端。

通过阅读许多其他资料,我确信单个 channel (tcp 连接)可以被多路复用,现在我们有两种选择来实现它:

  1. 一个 channel <-->一个 stub
    一个 stub <-->多个流

  2. 一个 channel <-->多个 stub
    一个 stub <-->多个流

唯一的区别是是否在 stub 之间共享一个 channel 。我的回答是:是的,你可以,原因是:

  1. 你的 reports of people having issues示例是用 ruby​​ 编写的,但我也可以找到 python examples站在对面。所以行为可能取决于语言实现

  2. 同步 cpp 客户端示例使用一个 stub 对象来发出一个 rpc,并且它没有任何关联的流对象,那么实现多路复用目的的唯一方法就是共享一个 channel 对象 stub 。

结合以上两个原因,我得出结论:在 C++ 中, stub 之间共享一个 channel 是有效的

现在,回到你的问题:

Does gRPC expect only one client per channel for a given service or can I have multiple clients on the client endpoint talking to a single service?

当然,您可以让多个客户端与一个服务通信。

If allowed, how do I achieve multiple clients for a given service on a client endpoint?

您可以只从一个 channel 或多个 channel 生成多个 stub ,考虑到连接开销,前者是更好的选择。

How does the server distinguish these as independent clients?

这是由于http2,它可以多路复用,并且有自己的规则来实现这一点,grpc需要做的就是遵循这些规则。

希望这对您有所帮助!

关于c++ - 我应该共享 gRPC stub 还是 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47022097/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com