【译】gRPC负载均衡
原文地址: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负载均衡的更多相关文章
- gRPC负载均衡(客户端负载均衡)
前言 上篇介绍了如何使用etcd实现服务发现,本篇将基于etcd的服务发现前提下,介绍如何实现gRPC客户端负载均衡. gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Bal ...
- gRPC负载均衡(自定义负载均衡策略)
前言 上篇文章介绍了如何实现gRPC负载均衡,但目前官方只提供了pick_first和round_robin两种负载均衡策略,轮询法round_robin不能满足因服务器配置不同而承担不同负载量,这篇 ...
- Kubernetes 中的 gRPC 负载均衡
安装环境依赖 docker-desktop >= 4.1.1 kubernetes >= 1.21.5 go >= 1.17 protobuf >= 3.17.3 istioc ...
- grpc服务发现与负载均衡
前言 在后台服务开发中,高可用性是构建中核心且重要的一环.服务发现(Service discovery)和负载均衡(Load Balance)一直都是我关注的话题.今天来谈一下我在实际中是如何理解及落 ...
- .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...
- .Net Core Grpc Consul 实现服务注册 服务发现 负载均衡
本文是基于..net core grpc consul 实现服务注册 服务发现 负载均衡(二)的,很多内容是直接复制过来的,..net core grpc consul 实现服务注册 服务发现 负载均 ...
- 基于gRPC的注册发现与负载均衡的原理和实战
gRPC是一个现代的.高性能.开源的和语言无关的通用RPC框架,基于HTTP2协议设计,序列化使用PB(Protocol Buffer),PB是一种语言无关的高性能序列化框架,基于HTTP2+PB保证 ...
- 为什么对gRPC做负载均衡会很棘手?
在过去的几年中,随着微服务的增长,gRPC在这些较小的服务之间的相互通信中获得了很大的普及,在后台,gRPC使用http/2在同一连接和双工流中复用许多请求. 使用具有结构化数据的快速,轻便的二进制协 ...
- 【译】 Node.js v0.12的新特性 -- Cluster模式采用Round-Robin负载均衡
原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing 本 ...
随机推荐
- java HotSpot 内存管理白皮书
原文见:http://www.open-open.com/lib/view/open1381034220705.html.查阅资料后,对原文做了补充. 文中关于JVM的介绍基于JDK1.6的Hotsp ...
- BZOJ 2406: 矩阵 [上下界网络流 二分答案]
2406: 矩阵 题意:自己去看吧,最小化每行每列所有元素与给定矩阵差的和的绝对值中的最大值 又带绝对值又带max不方便直接求 显然可以二分这个最大值 然后判定问题,给定矩阵每行每列的范围和每个元素的 ...
- BZOJ 2004: [Hnoi2010]Bus 公交线路 [DP 状压 矩阵乘法]
传送门 题意: $n$个公交站点,$k$辆车,$1...k$是起始站,$n-k+1..n$是终点站 每个站只能被一辆车停靠一次 每辆车相邻两个停靠位置不能超过$p$ 求方案数 $n \le 10^9, ...
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...
- 数据提交成功后如何避免alert被window.location.reload()影响
数据提交成功用alert提示,但页面立马就重载了 alert("提交成功!"); window.location.reload(); 如何避免? 方法一: setTimeout 延 ...
- 算法&数据结构系列 -- 堆(优先队列)
前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...
- R语言-主成分分析
1.PCA 使用场景:主成分分析是一种数据降维,可以将大量的相关变量转换成一组很少的不相关的变量,这些无关变量称为主成分 步骤: 数据预处理(保证数据中没有缺失值) 选择因子模型(判断是PCA还是EF ...
- 【Tools】ubuntu16.04升级Python2.7到3.5
最近开始学Python,但我发现我ubuntu16.04上默认的Python是2.7,并不是3,x 于是准备Python升级,记录安装过程给初学者参考一下. 1.先取得管理员权限, 个人习惯先取得管理 ...
- Maven文件配置
Maven文件路径的配置 默认设置 修改之后的设置 Maven文件内容的配置 对于Maven 的 settings.xml 文件,需要注意. <mirror>镜像元素之间是互斥的,优先级是 ...
- MySQL事务处理案例演示
<?php $mysqli=new mysqli("localhost", "root", "123456", "xsphp ...