【RPC Dubbo】dubbo负载均衡策略

【RPC Dubbo】dubbo负载均衡策略文章目录前言参考前言在上一篇博客中,介绍了zookeeper作为dubbo的注册中心是如何工作的,有一个很重要的点,我们的程序是分布式应用,服务部署在几个节点(服务器)上,当消费者调用服务时,zk返回给dubbo的是一个节点列表,但是dubbo只会选择一台服务器,那么它究竟会选择哪一台呢?这就是dubbo的负载均衡策略了,本篇博客就来聚焦dubbo的负载均衡策略。参考dubbo负载均衡策略…

大家好,又见面了,我是你们的朋友全栈君。

前言

在上一篇博客中,介绍了zookeeper作为dubbo的注册中心是如何工作的,有一个很重要的点,我们的程序是分布式应用,服务部署在几个节点(服务器)上,当消费者调用服务时,zk返回给dubbo的是一个节点列表,但是dubbo只会选择一台服务器,那么它究竟会选择哪一台呢?这就是dubbo的负载均衡策略了,本篇博客就来聚焦dubbo的负载均衡策略。

1. 什么是负载均衡

1.1:负载均衡简介

以下是wikipedia对负载均衡的定义:

负载均衡改善了跨多个计算资源(例如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动的的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。使用具有负载平衡而不是单个组件的多个组件可以通过冗余提高可靠性和可用性。负载平衡通常涉及专用软件或硬件

1.2:简单解释

这个概念如何理解呢?通俗点来说假如一个请求从客户端发起,比如(查询订单列表),要选择服务器进行处理,但是我们的集群环境提供了5个服务器A\B\C\D\E,每个服务器都有处理这个请求的能力,此时客户端就必须选择一个服务器来进行处理(不存在先选择A,处理一会又选择C,又跳到D).说白了就是一个选择的问题。当请求多了的话,就要考虑各服务器的负载,一共5个服务器,不可能每次都让一个服务器都来处理吧,比如把让其他服务器来分压。这就是负载均衡的优点:避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题。

2. dubbo负载均衡策略

如果在消费端和服务端都配置了负载均衡策略,以消费端为准。

2.1 Random LoadBalance

  • 随机,按权重设置随机概率。默认策略

  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

权重大的, 随机到的概率就大一点, 假如 a权重9, b权重1, 则随机到a的概率是a的权重除以总权重即0.9, b的概率是0.1

2.2 RoundRobin LoadBalance

  • 轮询,按公约后的权重设置轮询比率。

  • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

    解决办法 : 结合权重,把第二台机(性能低的)的权重设置低一点

轮询就是多个服务提供者, 一个一个来执行请求. 假如有abc3个节点提供同一个服务, 其性能比例abc=2:1:1

普通轮询算法: 执行方案可能是 {a,b,c}
加权轮询算法: 配置a的权重是200, b和c的权重是100, 执行方案可能是 {a,a,b,c}
平滑加权轮询算法: 配置a的权重是200, b和c的权重是100, 执行方案可能是 {a,b,a,c}

2.3 LeastActive LoadBalance

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

消费者缓存每个服务提供者的信息, 每个服务提供者有一个active字段来代表当前消费者正在调用的线程数, 调用前加1, 调用后减1, 调用时找一个active字段最小的, 说明该服务提供者正被调用中的线程少。

严格来说,这个是局部的统计,即消费者统计自己关心的那些服务提供者,而不是在服务器端统计全局的。好处是减轻服务器压力,并简化统计方式。

我认为这个算法比较好, 一定程度上能够感知到服务端的压力, 动态调整选择的服务提供者。

完整逻辑是这样的:
1.消费者会缓存所调用服务的所有提供者,比如记为p1、p2、p3三个服务提供者,每个提供者内都有一个属性记为active,默认位0
2.消费者在调用次服务时,如果负载均衡策略是leastactive
3.消费者端会判断缓存的所有服务提供者的active,选择最小的,如果都相同,则随机
4.选出某一个服务提供者后,假设位p2,Dubbo就会对p2.active+1
5.然后真正发出请求调用该服务
6.消费端收到响应结果后,对p2.active-1
7.这样就完成了对某个服务提供者当前活跃调用数进行了统计,并且并不影响服务调用的性能

2.4 ConsistentHash LoadBalance

  • 一致性 Hash,相同参数的请求总是发到同一提供者。

其实就是路由至同一个key下

  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
  • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
  • 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key=“hash.arguments” value=“0,1” />
  • 缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key=“hash.nodes” value=“320” />

3. 配置

如果在消费端和服务端都配置了负载均衡策略,以消费端为准。

一般在实际项目我们配置权重或负载均衡时不在代码中写死,我们动态使用默认配置,需要调节时通过dubbo管控台上进行配置。

服务端服务级别:

<dubbo:service interface="..." loadbalance="roundrobin" />

服务端方法级别:

<dubbo:service interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>

客户端服务级别

<dubbo:reference interface="..." loadbalance="roundrobin" />

客户端方法级别:

<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>

4. 源码

参见下面的《dubbo负载均衡策略》

参考

dubbo负载均衡策略
负载均衡官网配置手册
Dubbo 基础概念 仅看负载均衡章节

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157458.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • checkra1n越狱ipadmini2_checkra1n不能跳过激活

    checkra1n越狱ipadmini2_checkra1n不能跳过激活ipadair112.5.5checkra1n越狱+绕过ID我的IPADAIR1是一台妖机,硬盘扩容过,序列号改过。​有一天我想安装duetdisplay(付费软件)把IPAD作为PC的副显示器,然后在能的淘宝上买了个账号,登录之后,安装之后,忘记退ID了,然后我还给抹除了设置,重启之后出现ID锁,心塞然后开始绕ID之路经过两天的研究终于搞定。第一步是checkra1n越狱看了B站之后无数视频之后,开始干活,从github下载https://g

    2022年9月22日
  • 《自然语言处理实战入门》 第三章 :中文分词原理及相关组件简介 —- 语言学与分词技术简介[通俗易懂]

    汉语,即汉族的语言,是中国通用语言,国际通用语言之一,属汉藏语系,汉语历史悠久,使用人数最多,世界上使用汉语的人数至少15亿,超过世界总人口的20%汉字最早起源于商朝的甲骨文,距今已经有3000-4000年的历史了。文字的目的是为了记录,古汉语以独字为核心,即使隋唐以后汉语书面语逐渐向口语化发展。

    2022年4月17日
  • Qt内存映射「建议收藏」

    Qt内存映射「建议收藏」最近在看代码的时候发现了Qt的内存映射,原来只知道MFC有内存映射机制,可以在读取大数据文件时节约读取的时间,原来Qt中也有相应的机制,其用法更简单,下面用一个小例子演示其用法#include#include#include#include#includeint

    2022年6月21日
  • scp和rsync命令[通俗易懂]

    scp和rsync命令[通俗易懂]SCP命令(1)scp定义scp可以实现服务器与服务器之间的数据拷贝。(fromserver1toserver2)(2)基本语法scp-r$pdir/$fname$user@$host:$pdir/$fname命令递归要拷贝的文件路径/名称目的地用户@主机:目的地路径/名称(3)基本示例scp-rjdk1.8.0_291/root@hadoop103:opt/modulescp-rroot@hadoop102:/opt/module/*root@h

    2022年8月30日
  • 常用的数据库的字段类型及大小比较_sql字段长度

    常用的数据库的字段类型及大小比较_sql字段长度Oracle/MSSQL/Mysql 常用数据库的字段类型及大小  ORACLE的数据类型 常用的数据库字段类型如下: 字段类型中文说明限制条件其它说明 CHAR固定长度字符串最大长度2000bytes` VARCHAR2可变长度的字符串最大长度4000bytes可做索引的最大长度749 NCHAR根据字符集而定的固定长度字符串最大长度200…

    2022年9月6日
  • SpringBoot2-[SpringBoot优缺点、微服务理解、版本仲裁]

    SpringBoot2-[SpringBoot优缺点、微服务理解、版本仲裁]??‍?博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家??擅长领域:Java、大数据、运维、电子??如果本文章各位小伙伴们有帮助的话,?关注+??点赞+?评论+?收藏,相应的有空了我也会回访,互助!!!?另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!文章目录Spring.ioSpring5重大升级SpringBoot优点SpringBoot缺点微服务SpringBoot官方文档Maven设置SpringBo..

    2022年9月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号