我阅读了 gRPC核心概念、架构和生命周期,但没有深入到我喜欢看到的深度。有RPC 调用、gRPC 通道、gRPC 连接(文章中未描述)和 HTTP/2 连接(文章中未描述)。
我很想知道这些是如何结合在一起的。例如,当 RPC 抛出异常时,通道会发生什么?当通道关闭时,gRPC 连接会发生什么?通道什么时候关闭?gRPC 连接何时关闭?心脏跳动?逾期了怎么办?
任何人都可以回答这些问题,或者向我指出可以的资源吗?
Eri*_*son 10
连接不是 gRPC 概念。它不是普通 API 的一部分,而是一个实现细节。这应该被视为相当正常,就像 HTTP 库提供有关 HTTP 交换的详细信息但不公开连接一样。
最好将 RPC 和连接视为两个基本独立的系统。
对于不同的“托管”定义,唯一真正的保证是“连接由通道管理”。如果您希望释放连接和其他资源,则必须在不再使用时关闭通道。其他细节是实现细节或高级 API 细节。
没有“gRPC 连接”。“gRPC 连接”只是标准的“HTTP/2 连接”。除此之外,这甚至是许多 gRPC 实现中传输的实现细节。这允许有替代的“连接”类型,如“inprocess”或 QUIC(通过 Cronet,那里根本没有经典的“连接”)。
保持所有连接并根据需要重新连接是通道的工作。它将部分责任委托给负载均衡器,并且负载均衡 API 确实有一个连接(子通道)的概念。通过不向应用程序公开连接,负载平衡器有很大的操作自由。
我会注意到基于 gRPC C-core 的实现跨通道共享连接。
当 RPC 抛出异常时,通道会发生什么?
失败的 RPC 不会影响通道和连接。请注意,连接级故障通常会导致 RPC 失败。但是像重试这样的事情可以允许在新连接上重新发送 RPC。
当通道关闭时,gRPC 连接会发生什么?
连接最终关闭。通道关闭不是即时的,因为现有的 RPC 可以继续,并且连接关闭也不是即时的。但是一旦所有 RPC 完成,连接就会关闭。尽管 C-core 在没有通道使用它之前不会关闭连接。
通道什么时候关闭?
只有当用户关闭它时。
gRPC 连接何时关闭?
很多次。客户端可以在不再需要时关闭它。例如,假设服务器 IP 地址更改并且客户端需要连接到 1.1.1.2 而不是 1.1.1.1。将创建一个新连接,新的 RPC 将转到新的 IP 地址。客户端还可以关闭它认为已死的连接(例如,通过保持活动超时)。
服务器对何时关闭连接有很多发言权。他们可能只是因为它们太旧,或者因为它们一直处于空闲状态,或者因为服务器过载而关闭它们。但这些只是用例;服务器可以随意关闭连接。
逾期了怎么办?
截止日期仅适用于 RPC,不会影响通道或连接。
vin*_*ins 10
我实际上正在等待Eric回答这个问题,因为他是这方面的专家!
我也已经玩了一段时间 gRPC,我想在这里为初学者添加一些东西。有经验的朋友,欢迎补充!
通道是对长期连接的抽象!客户端应用程序将在启动时创建一个通道。通道可以在多个线程之间重用/共享。它是线程安全的。对于多线程和多路复用并发请求,一个通道就足够了(对于大多数用例)。关闭/重新连接/保持连接处于活动状态等是通道的责任。我们作为用户通常不必担心这一点。客户端应用程序可以随时关闭通道。频道创建似乎是一个昂贵的过程。所以我们不会为每个 RPC 打开/关闭。
当您对域名使用 gRPC loadbalancer/nameresolver 并且 nameresolver 解析具有多个 ip 地址的域时,通道会创建多个子通道,其中每个子通道是对与 1 个服务器的连接的抽象。所以一个通道也可以代表多个连接!!
从Eric 的评论中添加一些注意事项。
如果名称解析器返回多个地址,则添加默认负载均衡器仍仅创建(大约)一个连接,因为默认值为 pick_first。但是,如果您将负载均衡器更改为 round_robin 或几乎任何其他策略,那么是的,一个通道中将有多个连接。即使名称解析器返回一个地址,负载均衡器也可以自由创建多个连接(例如,为了更高的吞吐量),但这在今天并不常见
底层连接可以因任何原因随时关闭。例如:远程服务器正在正常关闭以进行计划维护或连接空闲时间较长。在这种情况下,服务器可以向客户端发送 GOAWAY 信号,客户端可能会断开连接并重新连接到其他服务器。或者服务器可能由于 OOM 错误而崩溃。在这种情况下,通道将检测连接失败,并将重试其他服务器等的新连接。
通道可以不断向服务器发送 PING 帧以保持连接有效。这些都可以通过频道构建器进行配置。
有了以上这些信息,如果我们查看您的问题,
当 RPC 抛出异常时,通道会发生什么? 频道没有任何反应。服务器上未处理的异常可能会导致客户端的 RPC 失败。但是通道仍然可用于任何 RPC 调用。
当通道关闭时,gRPC 连接会发生什么? 通道是对连接的抽象。所以它将被关闭。(同样没有像 Eric 提到的那样的 gRPC 连接。这将是一个 HTTP2 连接)
通道什么时候关闭? 随时都可以。但通常在应用程序关闭时。
gRPC 连接何时关闭? 这不是我们的问题。频道负责这个。
心脏跳动? 通道定期发送 PING 帧以保持连接有效。
逾期了怎么办? 这有点像客户端的超时。当截止日期超过时,客户端可能会取消请求。频道再次没有任何反应。(但它可能会在我注意到几次的服务器端触发异常。(收到未知流的数据帧。https://github.com/grpc/grpc-java/issues/3548)。似乎已经现已修复)。
| 归档时间: |
|
| 查看次数: |
3352 次 |
| 最近记录: |