原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md

gRPC负载均衡


范围


本文档解释了gPRC的负载均衡的设计。

背景


每次调用的负载均衡


值得注意的是gRPC的负载均衡是反生在每次调用的基础上,而不是每条连接的基础上。换言之,即使所有请求都来自于同一个客户端,我们仍旧想要它们被负载到所有的服务器上。

负载均衡的方式


在gPRC的负载均衡之前,先研究一下一些常见的负载均衡方式。

代理模式

代理提供一个可靠的可以上报负载情况到负载均衡系统的客户端,因为代理会暂时的保留RPC请求和响应的副本,所以通常它们需要更多的资源。这个模式也增加了PRC的延迟。

在考虑到请求压力较重的服务,例如存储服务,代理模式被认为是效率低下的。

客户端感知负载

这个更厚的客户端将更多的负载均衡逻辑放在客户端。例如,客户端会包含许多负载均衡策略(轮询,随机等)用于在一个列表中选择服务。这个模式下,一个由名称解析系统或外部的负载均衡器等提供的服务器的列表会被静态的配置在客户端,这种情况下,客户端负责从列表中选择最佳的服务器

这个方法的其中一个缺点是需要编写和维护包含多种语言或版本的负载均衡策略的客户端。那些策略可能会非常的复杂。一些算法需要客户端与服务端的交互,所以客户端可能需要变得更厚来提供额外的RPC用来健康检查或从用户发送的RPC请求中获取额外的负载信息。

它也会使客户端的代码变得复杂:新的设计要隐藏多层负载均衡的复杂性使之就像是一个对于客户端的简单的服务端列表。

外部负载均衡服务

客户端负载均衡代码保持简单且可移植,实现了众所周知的算法(例如:轮询调度)用于选择服务。负载均衡器提供更复杂的负载均衡算法。客户端依赖于负载均衡器提供负载均衡配置以及一个客户端要发送请求到的服务器列表。当服务不可用或健康问题出现时,均衡器会更新需要均衡负载的服务器列表。负载均衡器会做出任何复杂的必须的决定并通知客户端。负载均衡器会和后端的服务器交互来收集负载和健康信息。

需求


简单的API和客户端


gRPC客户端负载均衡代码必须简单且可移植的。客户端应该只包含简单的算法(例如:轮询调度)来选择服务器。对于复杂的算法,客户端应该依赖于一个负载均衡器来提供负载均衡配置和客户端应该发送请求到的服务器列表。当服务不可用或健康问题出现时,均衡器会更新需要均衡负载的服务器列表。负载均衡器会做出任何复杂的必须的决定并通知客户端。负载均衡器会和后端的服务器交互来收集负载和健康信息。

安全性


负载均衡器会和后台服务分开且一个折衷的负载均衡器会导致负载均衡器的负载均衡功能受到损害。换言之,一个折衷的的负载均衡器不应该导致客户端信任一个(可能是恶意的)后端服务器,而不是在没有负载均衡的情况下。

架构


综述


gRPC主要的负载均衡机制是外部负载均衡器,一个外部的负载均衡器提供简单的客户端和一个最新的服务器列表

gPRC客户端提供一个API来支持内置的负载均衡策略,然而,只有很少数(其中一个是grpclb策略实现了一个外部负载均衡器),并且不鼓励用户尝试添加更多的来扩展gRPC。相反的,新的负载均衡策略应该实现在外部的负载均衡器上。

工作流


在名称解析和服务器链接中,负载均衡策略适合gPRC客户端工作流。以下是它如何工作的:

1. 启动时,gPRC客户端通过服务名发起一个名称解析请求。名称会被解析为一个或更多的IP地址,每个地址指明它是一个服务器地址或一个负载均衡器地址,并且包含一个服务器配置指明那一个客户端的负载均衡策略应该被使用(例如: 轮询调度或grpclb)

2. 客户端实现一个负载均衡策略。

  • 注意:如果任何一个被解析器返回的地址是均衡器地址,那么这个客户端会使用grpclb策略,而不管请求的服务配置是那种负载均衡策略。否则,客户端会使用一个请求的服务配置负载均衡策略。如果没有负载均衡策略,那么客户端会使用默认的取第一个可用服务器地址的策略。

3. 负载均衡策略对每一个服务器地址创建一个子通道。

  • 除了grpclb以外的所有策略,这意味每个被解析器返回的地址的子通道。需要注意的是这些策略会忽略任何被解析器返回的均衡器地址。
  • grpclb策略,工作流如下:
    • 这个策略打开一个从解析器返回的均衡器地址之一的流。它使用客户端请求的服务器名称请求均衡器来获取服务器地址(例如: 和传递给名称解析器的相同的名称)

      • 注意:在grpclb策略中,解析器返回的非解析器地址用于后备来防止在负载均衡策略启动后没有均衡器能够用来交互。
    • 负载均衡器给客户端指向的gRPC服务器应该在负载均衡器的配置需要报告负载信息信息时报告负载信息给负载均衡器
    • 负载均衡器返回一个服务器列表给gRPC客户端的grpclb策略。grpclb策略对每个列表中的服务器创建一个子通道。

4. 对于每个PRC发送请求,负载均衡策略决定应该发送到哪个子通道(例如: 哪个服务器)。

  • grpclb策略下,客户端按负载均衡器返回的顺序发送请求到服务器。如果服务器列表为空,调用将会阻塞直到收到一个非空的列表。

【译】gRPC负载均衡的更多相关文章

  1. gRPC负载均衡(客户端负载均衡)

    前言 上篇介绍了如何使用etcd实现服务发现,本篇将基于etcd的服务发现前提下,介绍如何实现gRPC客户端负载均衡. gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Bal ...

  2. gRPC负载均衡(自定义负载均衡策略)

    前言 上篇文章介绍了如何实现gRPC负载均衡,但目前官方只提供了pick_first和round_robin两种负载均衡策略,轮询法round_robin不能满足因服务器配置不同而承担不同负载量,这篇 ...

  3. Kubernetes 中的 gRPC 负载均衡

    安装环境依赖 docker-desktop >= 4.1.1 kubernetes >= 1.21.5 go >= 1.17 protobuf >= 3.17.3 istioc ...

  4. grpc服务发现与负载均衡

    前言 在后台服务开发中,高可用性是构建中核心且重要的一环.服务发现(Service discovery)和负载均衡(Load Balance)一直都是我关注的话题.今天来谈一下我在实际中是如何理解及落 ...

  5. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  6. .Net Core Grpc Consul 实现服务注册 服务发现 负载均衡

    本文是基于..net core grpc consul 实现服务注册 服务发现 负载均衡(二)的,很多内容是直接复制过来的,..net core grpc consul 实现服务注册 服务发现 负载均 ...

  7. 基于gRPC的注册发现与负载均衡的原理和实战

    gRPC是一个现代的.高性能.开源的和语言无关的通用RPC框架,基于HTTP2协议设计,序列化使用PB(Protocol Buffer),PB是一种语言无关的高性能序列化框架,基于HTTP2+PB保证 ...

  8. 为什么对gRPC做负载均衡会很棘手?

    在过去的几年中,随着微服务的增长,gRPC在这些较小的服务之间的相互通信中获得了很大的普及,在后台,gRPC使用http/2在同一连接和双工流中复用许多请求. 使用具有结构化数据的快速,轻便的二进制协 ...

  9. 【译】 Node.js v0.12的新特性 -- Cluster模式采用Round-Robin负载均衡

    原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing 本 ...

随机推荐

  1. 小甲鱼OD学习第3讲

    这次我们的任务是破解这个过期的软件,效果如图所示 我们通过阅读代码,知道这个程序的执行流程如图中注释所示 观看下图注释所示 这是失败的提示代码 这是成功的提示代码 最后我们可以得出结论,成功破解软件的 ...

  2. Docker小记 — Docker Engine

    前言 用了Docker方才觉得生产环境终于有了他该有的样子,就像集装箱普及之后大型货轮的价值才逐渐体现出来,Docker详细说明可查阅"官方文档".本篇为Docker Engine ...

  3. Phone文件备份

    一 把照片导入到本地 连接手机和PC,插上数据线后PC上会自动检测并弹出对话框,提示导入 可以指定导入的目录.确定之后点击导入即可开始执行导入操作. 二 把语音备忘录导入到本地 需要借助iTunes联 ...

  4. 《Discuz安装时候出现乱码 -- 问题解决方法》

    自我安装discuz时出现安装界面乱码的情况,跟链接所说一样,经过原作的分享,加上我自己的实验,明白了,什么时候修改/usr/local/php/etc/php.ini里面的default_chars ...

  5. dedecms判断当前页面是否为首页 织梦设置首页高亮

    做织梦网站导航栏时,我们一般需要设置当前栏目高亮显示,这个使用currentstyle就能直接实现,但是如果在首页时怎么让首页模块高亮呢? 织梦当前栏目高亮: <style>.hover{ ...

  6. maven项目打包的时候,*Mapper.xml 文件会打不不进去解决办法

    打包的时候,不同版本的 Eclipse 还有IDEA 会有打包打不进去Mapper.xml 文件,这个时候要加如下代码, 在<build> 标签内加入即可 <resources> ...

  7. CEF小白人系列2-DEV环境配置-Windows10+SDK+VS2015

    以下资料整理来自CEF官方教学.作者做了翻译和整理.并会以一种重事件操作的方式来一点点入门. 3个问题: 在上一篇内容中我们了解了什么是CEF,能干些什么.必要的物理学习环境. 下面我们也是以带着问题 ...

  8. 通过修改注册表设置windows环境变量

    开发环境搭建每次都要设置很多环境变量, 一般是通过  [菜单]->[计算机]->[属性]->[高级设置]->[环境变量]进行设置,重装系统后,每次都要设置很多环境变量,很麻烦. ...

  9. SQL替换语句 批量修改、增加、删除字段内容

    sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 此表要替换的字段名=REPLACE(此表要替换的字段名, '原来内 ...

  10. composer安装出现proc_open没有开启问题的解决方案

    今天在安装下载项目的时候,使用composer来安装依赖.遇到了 The Process class relies on proc_open, which is not available on yo ...