zoukankan      html  css  js  c++  java
  • HTTP / 2上的gRPC设计可靠,高性能的协议

     

    在本文中,我们将研究gRPC如何建立在HTTP / 2的长期连接上,从而为服务间通信创建高性能,强大的平台。我们将探讨gRPC和HTTP / 2之间的关系,gRPC如何管理HTTP / 2连接以及gRPC如何使用HTTP / 2来保持连接的活动性,健康性和利用率。

    gRPC语义

    首先,让我们深入研究gRPC概念与HTTP / 2概念的关系。gRPC引入了三个新概念:通道1远程过程调用(RPC)和消息两者之间的关系很简单:每个通道可能有许多RPC,而每个RPC可能有许多消息。

    频道对应

    让我们看一下gRPC语义与HTTP / 2的关系:

    HTTP / 2上的gRPC

    通道是gRPC中的关键概念。HTTP / 2中的流在单个连接上启用多个并发会话;通道通过在多个并发连接上启用多个流来扩展此概念。从表面上看,通道为用户发送消息提供了便捷的界面。但是,在引擎盖下,要进行大量的工程设计以保持这些连接的生命,健康和利用。

    通道表示到端点的虚拟连接,实际上,它可以由许多HTTP / 2连接支持。RPC与连接关联(此关联将在后面进行描述)。RPC实际上是普通的HTTP / 2流。消息与RPC关联,并以HTTP / 2数据帧的形式发送。更具体地,消息被分层上的数据帧的顶部。一个数据帧可能包含许多gRPC消息,或者如果一个gRPC消息很大2,它可能会跨越多个数据帧。

    解析器和负载平衡器

    为了保持连接的活动性,健康性和可用性,gRPC利用了许多组件,其中最重要的是名称解析器负载平衡器解析程序将名称转换为地址,然后将这些地址交给负载平衡器。负载平衡器负责根据这些地址创建连接,并在连接之间进行负载平衡RPC。

    解析器和负载平衡器

    循环负载均衡器

    例如,DNS解析器可能会将某些主机名解析为13个IP地址,然后RoundRobin平衡器可能会创建13个连接(每个地址一个),并在每个连接中循环RPC。一个更简单的平衡器可能只是创建到第一个地址的连接。或者,想要多个连接但知道主机名只能解析一个地址的用户,可以让其平衡器针对每个地址创建连接10次,以确保使用多个连接。

    解析器和负载平衡器解决了gRPC系统中很小但很关键的问题。这种设计是有意的:将问题空间缩小到几个小的离散问题可以帮助用户构建自定义组件。这些组件可用于微调gRPC以适合每个系统的单独需求。

    连接管理

    配置完成后,gRPC将保持连接池(由解析器和平衡器定义)处于健康,活动和有效的状态。

    连接失败时,负载均衡器将使用地址3的最新已知列表开始重新连接同时,解析器将开始尝试重新解析主机名列表。在许多情况下这很有用。例如,如果代理不再可访问,我们希望解析器更新地址列表以不包括该代理的地址。再举一个例子:DNS条目可能会随着时间变化,因此地址列表可能需要定期更新。通过这种方式以及其他方式,gRPC被设计为具有长期弹性。

    解析完成后,会将新地址通知负载平衡器。如果地址已更改,则负载平衡器可能会将与新列表中不存在的地址的连接放慢,或创建与先前不存在的地址的连接。

    识别失败的连接

    gRPC连接管理的有效性取决于其识别失败连接的能力。通常,有两种类型的连接故障:干净故障(不进行通信)和不干净故障(不进行通信)。

    让我们考虑一个干净的,易于观察的故障。当端点有意终止连接时,可能会发生清除故障。例如,端点可能已正常关闭,或者已超过了计时器,提示端点关闭连接。当连接完全关闭时,TCP语义就足够了:关闭连接会导致FIN握手发生。这将结束HTTP / 2连接,从而结束gRPC连接。gRPC将立即开始重新连接(如上所述)。这很干净,不需要其他HTTP / 2或gRPC语义。

    不太干净的版本是端点在不通知客户端的情况下死亡或挂起的位置。在这种情况下,TCP可能会重试长达10分钟,然后才能视为连接失败。当然,无法识别连接中断10分钟是无法接受的。gRPC使用HTTP / 2语义解决了这个问题:使用KeepAlive配置时,gRPC将定期发送HTTP / 2 PING帧这些帧绕过流控制,用于确定连接是否有效。如果没有及时返回PING响应,则gRPC将认为连接失败,关闭连接,然后开始重新连接(如上所述)。

    这样,gRPC可使连接池保持健康,并使用HTTP / 2定期确定连接的健康状况。所有这些行为对用户都是不透明的,并且消息重定向是自动且即时进行的。用户只需在看似始终健康的连接池上发送消息即可。

    保持连接活跃

    如上所述,KeepAlive提供了一个宝贵的好处:通过发送HTTP / 2 PING来定期检查连接的运行状况,以确定连接是否仍处于活动状态。但是,它还有另一个同样有用的好处:向代理发送信号。

    考虑客户端通过代理将数据发送到服务器。客户端和服务器可能会乐于无限期地保持连接状态,并根据需要发送数据。另一方面,代理通常受到资源的限制,可能会杀死空闲的连接以节省资源。Google Cloud Platform(GCP)负载平衡器会在10分钟后断开明显空闲的连接,并且Amazon Web Services弹性负载平衡器(AWS ELB)在60秒后断开它们的连接

    使用gRPC定期在连接上发送HTTP / 2 PING帧时,将创建非空闲连接的感知。使用上述闲置终止规则的端点将通过终止这些连接。

    强大的高性能协议

    HTTP / 2为长期的实时通信流提供了基础。gRPC建立在此基础之上,具有连接池,运行状况语义,有效使用数据帧和多路复用以及KeepAlive。

    选择协议的开发人员必须选择能够满足当今和未来需求的协议。选择gRPC可以很好地为他们服务,无论是针对弹性,性能,长期通信还是短期通信,可定制性,或者只是知道他们的协议将扩展到非常庞大的流量,同时始终保持高效。要立即使用gRPC和HTTP / 2,请查看gRPC的入门指南

    脚注

    1. 在Go中,gRPC通道称为ClientConn,因为“通道”一词具有特定于语言的含义。
    2. gRPC将HTTP / 2默认最大大小用于16kb的数据帧。超过16kb的消息可能会跨越多个数据帧,而小于该大小的消息可能会与一些其他消息共享一个数据帧。
    3. 这是RoundRobin平衡器的行为,但并非每个负载平衡器都这样做或必须以这种方式运行。
  • 相关阅读:
    gridview填加双击事件
    后台找前台服务器控件,客户端控件方法
    ie缓存是什么 和 清除ie缓存方法
    js 去掉空格的方法
    SQL 用户sa登录失败,该用户与可信sql server连接无关联
    (转)C#里面比较时间大小三种方法
    sql UNION 和 UNION ALL 的区别
    windows 计划任务 打开窗口
    mysql 优化8种方式
    javascript小括号表达式
  • 原文地址:https://www.cnblogs.com/a00ium/p/14158593.html
Copyright © 2011-2022 走看看