Load Balancing in gRPC
背景
基于每次调用的负载均衡
需要注意的是,gRPC的负载均衡发生在每次调用时,而不是每次连接时。换句话说,就算所有的请求来自于同一个客户,我们也希望可以将它们负载均衡到所有的服务器。
负载均衡的方法
在讨论gRPC所使用的负载均衡之前,我们讨论一下常规的负载均衡方式。
代理方式
使用代理作为可信任的客户端,向负载均衡系统发送请求。因为它们需要有RPC请求和回复的临时副本,代理通常需要更多的资源来进行这个操作。这个也会增加RPCs请求的延迟。代理模式在处理heavy services (像存储)一类的时,被认为是低效的。
客户端处理负载均衡
复杂的客户端可以有负载均衡的逻辑。例如,客户端可以有许多负载均衡的算法(轮询,随机等)来从一组服务器中选择一个来发送请求。这组服务器可以是直接在客户端进行静态配置,通过name resolution系统提供,或者通过一个外部的负载均衡器来提供。无论是哪种方式,客户端需要从一组服务器中选择一个来发送请求。
这种方式有一个缺点,你需要维护多个语言,甚至每个语言多个版本的负载均衡算法,这些算法可能很复杂。一些算法需要客户端和服务端进行通信,来获取服务器的健康状态和负载信息,这些都会使客户端的逻辑变得更复杂,而不只是发送客户的rpc请求。
外部负载均衡服务
这种方式下,客户端会有比较简单和可移植性的代码,会实现一些用于服务器选择的很常用的算法(例如轮询)。复杂的负载均衡算法由负载均衡器来实现,并提供给客户端会用。客户端依赖于负载均衡器来获取负载均衡的配置信息和一组可以用来处理客户rpc请求的服务器列表。负载均衡器可能会收集服务器的负载和健康状态信息,处理这些信息,然后均衡器通过更新服务器列表来均衡负载。在必要的时候,均衡器会把这些修改告知给客户端。
构架
概况
当前grpc负载均衡的主要机制是外部负载均衡,也就是说使用外部负载均衡服务来提供一组可用的服务器。
当前grpc的做法是,客户端自带很少的一些负载均衡策略,复杂的负载均衡策略依赖于外部负载均衡服务。
工作流

复杂均衡的策略通过如下方式集成到name resolution和连接服务端之间的客户端工作流中。下面是其工作方式:
- 开始时,grpc客户端使用服务器名发送一个name resolution的请求。这个名字将会解析成一个或者多个IP地址,每一个地址会指出这个是一个服务器地址还是一个负载均衡器地址,还会返回一个服务器配置,用来给出使用哪种客户端负载均衡策略(例如round_robin或者grpclb)。
- 客户端创建这个负载均衡的实例。
注意:如果resolver返回的任意一个地址是负载均衡器的地址,那么客户端将会使用grpclb的负载均衡策略,而不是关心服务器配置上给出的负载均衡策略, 否则客 户端会使用服务器配置上给出的负载均衡策略. 如果服务器配置上没有给出负载均衡策略,那么客户端将会使用默认策略,也就是选择第一个可用的服务器地址.
3. 负载均衡策略创建一个子管道到每一个服务器地址
(1) 对于除了grpclb之外的所有策略,这意味着根据resolver返回的每一个地址,创建一个子管道. 注意,这些策略会忽略resolver返回的负载均衡器的地址.
(2) 对于grpclb策略,工作流如下:
a. 客户端从resolver返回的负载均衡器地址中选择一个创建数据流. 客户端询问询问负载均衡器, 获取可以用于服务的服务器地址(针对于之前请求的服务器
名, 即最初传入name resolver那个服务器名).
注:在grpclb策略中,可以返回不是负载均衡器的地址,这个用来防止连不上负载均衡器.
b. 如果负载均衡器调度需要的话, 客户端连接的服务器可能会向负载均衡器发送负载相关的信息.
c. 负载均衡器向grpc客户端的grpclb模块返回服务器列表. grpclb模块然后和返回的服务器列表中的每个服务器创建一个子管道.
4. 对于每一个rpc请求, 负载均衡策略决定使用哪个子管道发送这个请求.
在grpclb策略中, 客户端会按照负载均衡器返回的服务器列表中的顺序发送请求. 如果服务器列表为空, 这个调用将会阻塞, 一直等到存在可用的服务器为止.
Load Balancing in gRPC的更多相关文章
- gRPC Load Balancing
gRPC Load Balancing 翻译自:https://grpc.io/blog/grpc-load-balancing/ 这是gRPC负载均衡的第一篇,后续会给出基于golang XDS服务 ...
- Load Balancing with NGINX 负载均衡算法
Using nginx as HTTP load balancer Using nginx as HTTP load balancer http://nginx.org/en/docs/http/lo ...
- 【架构】How To Use HAProxy to Set Up MySQL Load Balancing
How To Use HAProxy to Set Up MySQL Load Balancing Dec 2, 2013 MySQL, Scaling, Server Optimization U ...
- CF# Educational Codeforces Round 3 C. Load Balancing
C. Load Balancing time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces Educational Codeforces Round 3 C. Load Balancing 贪心
C. Load Balancing 题目连接: http://www.codeforces.com/contest/609/problem/C Description In the school co ...
- UVA 12904 Load Balancing 暴力
Load Balancing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vi ...
- Load Balancing 折半枚举大法好啊
Load Balancing 给出每个学生的学分. 将学生按学分分成四组,使得sigma (sumi-n/4)最小. 算法: 折半枚举 #include <iostrea ...
- [zz] pgpool-II load balancing from FAQ
It seems my pgpool-II does not do load balancing. Why? First of all, pgpool-II' load balancing is &q ...
- How Network Load Balancing Technology Works--reference
http://technet.microsoft.com/en-us/library/cc756878(v=ws.10).aspx In this section Network Load Balan ...
随机推荐
- C++ int double float对应的长度以及二进制
#include <iostream> using namespace std; void showIntBit(int a); void showDoubleBit(double a1) ...
- 《设计模式》读懂UML类图
一.类中的主要关系 继承.实现.组合.聚合.依赖.关联 二.UML类图 三.代码实现 public class H2O { } public class O2 { } public interface ...
- Spring boot启动成功后输出提示
添加logback-spring.xml,将log输出到文件,控制台输出的level改为error因此只会出处banner src/main/resources/banner.txt的内容为 star ...
- .Net Core 3 骚操作 之 用 Windows 桌面应用开发 Asp.Net Core 网站
前言 曾经在开发 Asp.Net 网站时就在想,为什么一定要把网站挂到 IIS 上?网站项目的 Main 函数哪儿去了?后来才知道这个 Main 函数在 w3wp.exe 里,这也是 IIS 的主进程 ...
- 2019 CSP-J 游记(CQ LNBS考场 的退役之战)
T0.10 爆零之战 已经不是第一次参加NOIP了(哦,关于兔子也NOIP了) 这次比赛的话,感觉考场很温馨,键盘很舒适,老师很友善,下次还会来.(哦不,下次来不了了,即将提前退役[大雾]) 刚刚文化 ...
- 今天七夕节,外面下着大雨,用Python的tkinter做一个下爱心雨的特效,发给妹子
今天七夕,还下着雨,刚好想做一个下着爱心雨的特效 准备图片素材 1.美图秀秀找一个爱心图,大小就50*50就可以,生成的是一个png格式文件 2.由于canvas.create_image只支持gif ...
- 对decimal 类型的数据进行获取调整
Decimal为SQL Server.MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数. 好处:使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储 ...
- SQlL Server ----- 通过年月进行查询
websit 中的代码. 不修改 对控件进行修改,展示年月 WdatePicker({ dateFmt: 'yyyy-MM', isShowToday: false, isShowClear: fa ...
- Linux下 Nginx安装与配置(Centos7)
1:下载解压 #下载 wget http://nginx.org/download/nginx-1.14.0.tar.gz #解压 tar -xzf nginx-1.14.0.tar.gz cd ng ...
- Python2 和 Python3区别
字符串类型不同 py3: str bytes py2: unicode str 默认解释器编码 输入输出 int int long 除法 range和xrang 模块和包 字典 keys py2:列表 ...