【译】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 本 ...
随机推荐
- 机器学习00:如何通过Python入门机器学习
我们都知道机器学习是一门综合性极强的研究课题,对数学知识要求很高.因此,对于非学术研究专业的程序员,如果希望能入门机器学习,最好的方向还是从实践触发. 我了解到Python的生态对入门机器学习很有帮助 ...
- JavaBean命名规范
———————————————————————————————————————————————————————— 属性名/类型 | ...
- C#实现航班查询及预订
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- Python数据结构之一——list(列表)
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ Python包含6种常见的内建序列.它们分别是列表.元祖.字符串.Unicode字符串.buffer(memory ...
- java中的foreach用法及总结
增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量,这个局部变量的类型与part2中的对象元素的类型是一致的. pa ...
- 使用tcp+select实现客户端与客户端的通信
使用多路复用实现客户端与客户端进行通信: 原理:客户端只要一连上服务器,立马给服务器发送用户名,然后在服务端将newsocketfd存放在同一个结构体中,客户端先给服务器发送数据,然后通过服务器转发给 ...
- "abc123 ,def456",反转字母,其他位置不变
"abc123 ,def456",反转字母,其他位置不变. 无意间看到个有意思的面试题,忽然来了兴趣想着来做一下. 操作字符串用正则的效率比较高,但第一反应还是用原生来操作.下面说 ...
- ubuntu14.04上实现faster rcnn_TF的demo程序及训练过程
安装环境:Ubuntu14.04.显卡Tesla K40C+GeForce GT 705.tensorflow1.0.0.pycharm5.0 说明:原文见博客园,有问题原文下留言,不定期回复.本文作 ...
- TKCPP
volume one: http://book.huihoo.com/thinking-in-cpp-2nd-ed-vol-one/ volume2 : http://book.huihoo.com/ ...
- Spring context:property-placeholder 一些坑
今天在配置多配置文件的时候偶然发现如果我使用 <context:property-placeholder location="classpath:filePath.properti ...