【摘要】 本文描述了CSE在使用Ribon组件期间发现的问题,以及CSE是如何解决这些问题以满足自身业务开发需要的。

Robin

Robin设计了几个核心接口:IRule、ILoadBalancer、ServerListFilter、IPing、ServerList、Server。开发者在使用的时候,需要组合使用这些接口。Robin提供了大量的接口实现,在使用这些实现或者自定义实现的时候,存在非常多的问题需要考虑:

1.       每一个实现类依赖的其他接口的功能是不确定的,不能够随意组合。比如:ServerListFilter只会被DynamicServerListLoadBalancer使用,而不会被ILoadBalancer的其他实现类使用;IRule的不同实现,依赖的ILoadBalancer接口不同,RoundRobinRule会调用getAllServerList,并且会判断返回的Server是否alive,而RandomRule则不会使用这些接口,这种情况会给实现ILoadBalancer的开发人员带来大量的困扰,他们必须对每一个可能的IRule实现进行测试,以保证提供给用户的功能说明是可靠的。这种情况带来的另外问题,就是限制了运维人员在运行时动态的调整负载均衡策略。使用Robin组件,更加适用于开发阶段确定好各个实现,而不进行修改。

2.       在使用ServerListFilter的时候,不能够基于每次请求的参数进行实例过滤。这样类似灰度发布等功能无法通过它实现。因为ServerListFilter会通过ILoadBalancer获取当前请求参数,而ILoadBalancer则被大量的请求共用。业务必须通过ThreadLocal来保存请求参数,以防止并发问题。初次使用这种机制的业务基本都会忽略这个问题,必须通过大量并发测试才可能发现,很多时候会将问题遗漏到生产环境。

3.       在需要动态调整IRule的场景,部分IRule的实现可能会导致内存泄露。比如WeightedResponseTimeRule。这个规则在初始化的时候,会启动Timer线程计算权重,并且每次更新ILoadBalancer的时候(调用setLoadBalancer方法),会重新初始化,如果并发控制不当,则会导致频繁创建线程造成OOM。这个问题需要在进行大量并发和持续运行的情况下才能够发现。

总结:Robin定义了很灵活的接口,在实现单一场景的时候,可以满足非常多场景的需求。但是在动态调整策略、自由组合策略以及定制开发过程中都存在大量的陷阱,需要开发人员非常谨慎使用,有些陷阱需要进行大量并发和长时间运行才能够发现。

CSE对负载均衡算法的改进

CSE结合自身对负载均衡的理解,对负载均衡处理流程进行了改进。下面是流程图:

1.       DiscoveryFilter主要管理实例进行分组、缓存。详细流程参考:https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance.html

2.       对每一个微服务分配一个LoadBalancer实例。

3.       ServerListFilerExt和RuleExt均对Robin的ServerListFilter和IRule进行了改进。参数增加了Invocation,这样可以支持基于接口参数的路由选择。对于ServerListFilter和IRule的扩展,都只需要实现接口,并不需要依赖大量的LoadBalancer的接口,这样就避免了业务在实现这些接口的时候,需要考虑组合的一致性,减少业务犯错误的风险。

4.       整改以后,业务不能在随意配置和使用IRule和ServerListFilter的实现。需要使用系统缺省的配置参数:RoundRobin、Random、SessionStickiness、WeightedResponse等,这些字符串表达和实现方式独立。业务也可以通过扩展ExtensionFactory实现自己的RuleExt和ServerListFilterExt。

基于响应时间权重问题

经过上述整改,CSE重新实现了WeightedResponseTimeRule,新实现的算法没有采用定时器和新线程,可以避免频繁替换Rule和并发场景下可能导致的内存泄露等问题。这个算法存在如下需要注意的问题:

1.       “权重”和“响应时间”并不是一个严格意义上的反比关系。比如时延为20ms和40ms,并不意味着实例选择的概率是2:1。目前计算“权重”和“响应时间”的算法为:

T = SUM(L1,L2,…,Ln)

(L1:L2:…:Ln) = (T-L1:T-L2:…:T-Ln)=(W1:W2:…:Wn)

“权重算法”是一个伪随机算法,实例的分布符合上述的公式,但是每次选中的实例是不可预期的。 另外,如果所有实例的响应时间均小于10ms,那么权重算法等同于RoundRobin算法。

2.       在实例数为100的情况下,基于响应时间权重算法比RoundRobin算法慢100倍。但是不用担心,这个是对实例列表遍历一遍的时间,在业务处理时间为10ms的情况下,只占用业务1/1000的时间。

来源:华为云社区  作者:liubao68

Robin负载均衡策略存在问题及CSE解决方案相关推荐

  1. tedu 四阶段springcloud学习day02学习总结(idea连接数据库/nacos远端调用及负载均衡策略/Feign方式远端调用)

    目录 查看接口有哪些实现类 ctrl + h 一.cmd方式启动Nacos的命令 二.在IDEA中打开MySQL数据库 第一步: 打开View中数据库的工具栏 第二步:添加数据库为MySql 第三步: ...

  2. Ribbon负载均衡策略

    目录 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, 2. @LoadBalanced 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, ...

  3. 负载均衡策略深入剖析

    在实际应用中,我们可能不想仅仅是把客户端的服务请求平均地分配给内部服务器,而不管服务器是否宕机.而是想使Pentium III服务器比Pentium II能接受更多的服务请求,一台处理服务请求较少的服 ...

  4. 负载均衡策略_负载均衡策略

    负载均衡策略有哪些?在实际应用中,我们可能不想仅仅是把客户端的服务请求平均地分配给内部服务器,而不管服务器是否宕机.而是想使Pentium III服务器比Pentium II能接受更多的服务请求,一台 ...

  5. SpringCloud组件:Ribbon负载均衡策略及执行原理!

    大家好,我是磊哥. 今天我们来看下微服务中非常重要的一个组件:Ribbon.它作为负载均衡器在分布式网络中扮演着非常重要的角色. 本篇主要内容如下: 在介绍 Ribbon 之前,不得不说下负载均衡这个 ...

  6. 负载均衡策略-七种策略

    LoadBalancer LoadBalancer下面更底层的7种内置的负载均衡策略 RandomRule - 随性而为 RoundRobinRule - 按部就班 RandomRule是随性而为挑选 ...

  7. Motan-远程调用的rpc框架的负载均衡策略

    虽然我不会,但是偶然之间看到了Motan远程调用框架的一些内容,然后直接copy过来了,想着以后自己可能看看 集群中的loadbalance负载均衡策略 ActiveWeightLoadBalance ...

  8. Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1.什么是Nginx,谈谈个人都理解,项目中是否用到,为什 ...

  9. nginx 反向代理和负载均衡策略实战案例

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:glmapper https://juejin.im/pos ...

最新文章

  1. Python小技巧:用 print() 函数实现的三个特效
  2. Android 用户信息管理程序【SQLite数据库、多选框、单选按钮】
  3. 修改Linux主机名
  4. MySQL 字符串转in/double类型——CAST/CONVERT函数的用法
  5. 采用Matlab编程实现 高频强调滤波,[转载]MATLAB图像处理-基于高频强调滤波和直方均衡化图像增强...
  6. 如何用iMazing备份恢复贪婪洞窟
  7. Java中三层架构与MVC之间的显著区别
  8. logrotate测试_日志管理工具logrotate
  9. 无法定位软件包dbus-glib-1
  10. OpenCV-图像处理(29、凸包-Convex Hull)
  11. ubuntu12.10 使用lync
  12. Java API II
  13. 刽子手c语言,古代神秘职业:刽子手的祖师爷
  14. Mapgis技巧篇1
  15. python画圣诞帽_用Python就可以给你的头像戴上圣诞帽,别@微信团队了!
  16. 【已解决】ModuleNotFoundError: No module named ‘snmp_cmds‘ 缺少snmp-cmds包
  17. Altium Designer 19卡顿的解决方法
  18. 214 情人节来袭,电视剧 《点燃我温暖你》李峋同款 Python爱心表白代码,赶紧拿去用吧
  19. ET-B31H-M@B人机界面密码开门显示“未配置”
  20. CTFSHOW 套娃shell

热门文章

  1. Android已申请动态权限报错,Android 读取或者写入U盘时,报错:Permission denied
  2. c语言 将点同时保证x坐标从小到大,y坐标从小到大地排序,C语言程序设计实验报告(二)...
  3. 请求报文的方法及get与post的区别
  4. Thinkphp3.2版本Controller和Action的访问方法
  5. Python图像处理库PIL的ImageStat模块介绍
  6. FTP服务器常规操作
  7. 第二章 面向对象的编程风格
  8. sharepoint项目部署
  9. 3G手机Android应用开发视频教程_黎活明老师的视频(第三天课程)总共有八天课程...
  10. 踏上Silverlight的征程 体验Silverlight之美