【译】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 本 ...
随机推荐
- 《Thinking in Java》学习笔记(五)
1. Java异常补充 a.使用try/catch捕获了异常之后,catch之后的代码是会正常运行的,认为即使进行了异常捕获,出现了异常就不往下执行,这是很多新手会犯的错误. public class ...
- Android图像处理 - 高斯模糊的原理及实现
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 天天P图攻城狮 发布在云+社区 作者简介:damonxia(夏正冬),天天P图Android工程师 前言 高斯模糊是图像处理中几乎每个程序员 ...
- POJ 3581 Sequence [后缀数组]
Sequence Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6911 Accepted: 1543 Case Tim ...
- HibernateTemplate#setMaxResults()的坑
如题所示,因为maxResults为实例属性,一经修改,则会应用于所有查询! 不是很清楚,Spring为什么要挖这个坑? 我的解决方案:如需设置返回结果集的大小,则通过HibernateCallbac ...
- EL表达式多条件判断方式
<td> <c:forEach items="${cityMap}" var="entry"> <hr> <input ...
- golang fmt.printf()
package main import "fmt" import "os" type point struct { x, y int } func main ...
- Python面向对象篇(3)-封装、多态、反射及描述符
1. 多态 多态,最浅显的意识就是同一事物具有多种形态,这很好理解,动物是一个大类,猫类属于动物类,狗类属于动物类,人也是属于动物类,那能理解成,猫.狗.人是一样的吗?当然不是,还有,水,分为液体.固 ...
- 基于微软企业库的AOP组件(含源码)
软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库 ...
- Ubuntu忘记root密码怎么办?
http://www.linuxidc.com/Linux/2016-05/131256.htm
- Yii2框架ACF(AccessControl Filter)的使用
AccessControl其实也就是 yii\filters\AccessControl Filter, 我们下面简写为 ACF 作为描述. ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控 ...