RPC的负载均衡策略
抽空自己写了个简易版的rpc框架,想了下怎么搞负载均衡, 最简单的方式就是搞个配置文件放置服务地址,直接读配置文件,转而想到配置文件可以放zk,相当于用zk来做配置中心或者服务发现。 优秀的dubbo项目就可以这么做,马上参考了下谷歌的grpc,发现了一篇谷歌很棒的文章,拜读了下(也借用了谷歌这篇文章的图片),很不错,想写一些我自己的见解。
传送门: https://grpc.io/blog/loadbalancing/
rpc通信本身并不复杂,只要定好协议怎么处理问题不大,但是负载均衡的策略是值得推敲的。
一般情况下,负载均衡的策略有以下两种
1. 代理服务
客户端并不知道服务端的存在,它所有的请求都打到代理服务,由代理服务去分发到服务端,并且实现公平的负载算法。 客户机可能不可信,这种情况通过用户面向用户的服务,类似于我们的nginx将请求分发到后端机器。
缺点: 客户端不知道后端的存在,且客户端不可信,延迟会更高且代理服务会影响服务本身的吞吐量
优点: 在中间层做监控等拦截操作特别棒。
如图:
2. 客户端负载均衡
客户端知道有多个后端服务,由客户端去选择服务端,并且客户端可以从后端服务器中自己总结出一份负载的信息,实现负载均衡算法。 这种方式最简单的实现就是我上面说的直接搞个配置文件,调用的时候随机或者轮询服务端即可。
如图:
优点:
高性能,因为消除了第三方的交互
缺点:
客户端会很复杂,因为客户端要跟踪服务器负载和健康状况,客户端实现负载均衡算法。多语言的实现和维护负担也很麻烦,且客户端需要被信任,得是靠谱的客户端。
以上是介绍了两种负载均衡的方案,下面要说的就是使用代理方式负载均衡的几种详细的方案
代理方式的负载均衡有很多种
代理负载平衡可以是 L3/L4(传输级别)
或 L7(应用程序级别)
。
在 L3/L4
中,服务器终止TCP连接并打开另一个连接到所选的后端。
L7
只是在客户端连接到服务端端连接之间搞一个应用来做中间人。
L3/L4
级别的负载均衡按设计只做很少的处理,与L7级别的负载均衡相比的延迟会更少,而且更便宜,因为它消耗更少的资源。
在L7(应用程序级)负载平衡中,负载均衡服务终止并解析协议。负载均衡服务可以检查每个请求并根据请求内容分配后端。这就意味监控拦截等操作可以非常方便快捷的做在这里。
L3/L4 vs L7
正确的打开方式有一下几种
- 这些连接之间的RPC负载变化很大: 建议使用L7.
- 存储或计算相关性很重要 :建议使用L7,并使用cookie或类似的路由请求来纠正服务端.
- 设备资源少(缺钱): 建议使用 L3/L4.
- 对延迟要求很严格(就是要快): L3/L4.
下面要说的就是客户端实现负载均衡方式的详细方案:
1. 笨重的客户端
这就意味着客户端中实现负载平衡策略,客户端负责跟踪可用的服务器以及用于选择服务器的算法。 客户端通常集成与其他基础设施(如服务发现、名称解析、配额管理等)通信的库,这就很复杂庞大了。
2. Lookaside 负载均衡 (旁观?)
旁观式负载平衡也称为外部负载平衡,使用后备负载平衡,负载平衡的各种功能智能的在一个单独的特殊的负载均衡服务中实现。客户端只需要查询这个旁观式的负载均衡服务, 这个服务就能给你最佳服务器的信息,然后你拿这个数据去请求那个服务端。 就像我一开说的比如把服务端的信息注册到zk,由zk去做负载均衡的事情,客户端只需要去zk取服务端数据,拿到了服务端地址后,直接向服务端请求。
如图:
以上说了这么多,到底服务间的负载均衡应该用哪个,总结以下几点:
-
客户端和服务器之间非常高的流量,且客户端是可信的,建议使用‘笨重’的客户端 或者 Lookaside 负载均衡
-
传统设置——许多客户端连接到代理背后的大量服务,需要服务端和客户端之间有一个桥梁,建议使用代理式的负载均衡
-
微服务- N个客户端,数据中心有M个服务端,非常高的性能要求(低延迟,高流量),客户端可以不受信任,建议使用 Lookaside 负载均衡

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
webflux提供响应式API,玩出不一样的花样
先说说什么是响应式 响应式编程或反应式编程(英语:Reactive programming)是一种面向数据流和变化传播的编程范式,直白的说就是:将变化的值通过数据流进行传播。 WebFlux又是什么呢 WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。 spring-webflux 模块。该模块包含对响应式 HTTP 和 WebSocket 客户端的支持,以及对 REST,HTML 和 WebSocket 交互等程序的支持。一般来说,Spring MVC 用于同步处理,Spring Webflux 用于异步处理。 Spring Boot Webflux 有两种编程模型实现,一种类似 Spring MVC 注解方式,另一种是基于 Reactor 的响应式方式。 实践走起 我在网找了下发现现在支持的DAL包有: spring-boot-starter-dat...
- 下一篇
马蜂窝用户内容贡献能力模型构建
在用户个性化时代,垂直化、精细化的运营,被看作企业重要的竞争力。完整、清晰的用户画像体系,可以帮助企业从海量的用户信息中发掘每个用户的行为特性、潜在能力及兴趣等信息,从而为用户提供具有针对性的服务。 马蜂窝拥有海量的用户出行体验数据,在成长和发展的过程中一直在探索如何通过基于海量 UGC 的数据挖掘出每个用户的基本特征、对旅游主题、目的地的偏好和潜在兴趣,从而精准地定位和标记用户,将优质的内容、商品和服务与用户进行连接。 今天这篇文章,主要围绕马蜂窝用户标签体系中的「用户贡献能力」标签,来介绍我们如何挖掘那些对马蜂窝的 UGC 有贡献能力的群体,这样做的价值是什么。 挖掘用户内容贡献能力的意义 鼓励用户分享原创内容、彼此借鉴旅游信息,是马蜂窝得以持续吸引用户的核心。这些用户产生的原创内容不仅包括记录自己旅游体验的攻略、游记,也包括帮助其他用户解决旅行疑惑的问答、点评等。通过这种互享型的内容互动模式,越来越多存在个性化旅行需求的用户在马蜂窝完成旅游消费决策的闭环。 为了更好地帮助用户提升决策效率,我们需要挖掘出那些拥有丰富的自由行经验,并且具有一定内容生产能力的旅行者,围绕内容增长、用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境