写点什么

Java Chassis 3:接口维度负载均衡

  • 2024-05-13
    广东
  • 本文字数:1006 字

    阅读完需:约 3 分钟

Java Chassis 3:接口维度负载均衡

本文分享自华为云社区《Java Chassis 3技术解密:接口维度负载均衡》,作者: liubao68。


Java Chassis 3技术解密:负载均衡选择器中解密了 Java Chassis 3 负载均衡在解决性能方面提供的算法。这次解密的技术来源于实际客户案例:


在客户的微服务系统中,存在很多种不同逻辑的接口,以及特殊的访问模式,经常会出现部分实例线程池排队严重,而其他实例负载不高的负载不均衡现象。比如:微服务 A 访问微服务 B,微服务 B 存在 B1、B2 两个实例,OP1、OP2 两个接口,其中 OP1 处理比较耗时,占用较多 CPU 时间,OP2 处理较快。微服务 A 的业务逻辑会以 OP1、OP2、OP1、OP2…这样的访问模式调用微服务 B。客户系统会经常出现 OP1 全部访问 B1、OP2 全部访问 B2 的现象。


产生这个问题的原因是 Round Robin 算法根据请求顺序来分配实例,而未差异化考虑不同请求的均衡要求。解决这个问题最简单直接的思路是使用 Random 算法,但是在进行负载均衡算法选择的时候,可预期性对于问题定位、问题分析、问题规避等都有非常大的便利,因此 Round Robin 算法仍然是缺省的最优选择。


Java Chassis 3 的解决方案是提供接口维度的负载均衡。



默认场景,Java Chassis 为每个契约(Schema)创建一个负载均衡,如果 OP1 和 OP2 分别属于 UserService 和 LoginService,那么在上述示例的场景中,开发者不需要做任何配置,流量会自动实现均衡。


如果 OP1 和 OP2 都属于 LoginService,并且需要保证 OP1 的流量均衡,可以通过配置:


servicecomb.loadbalance.${微服务B}.${契约名称}.${接口名称}.strategy.name=RoundRobin
复制代码


比如:


servicecomb.loadbalance.B.LoginService.login.strategy.name=RoundRobin
复制代码


给耗时请求 OP1(login)设置不同的负载均衡。

进一步讨论


从上述负载均衡的原理可以看出,假设微服务 X 会访问 M 个微服务,每个微服务平均有 N 个契约,那么 X 会创建 M * N 的负载均衡。对于大多数系统,这个数量级都在 1K 以内。一般的,只需要对于耗时的接口分配独立的负载均衡,以保证耗时请求的流量均衡。除了解决流量均衡问题,Java Chassis 的配置方法,还可以针对其他特殊场景提供非常简洁的配置方案,比如可以通过配置:


servicecomb.loadbalance.${微服务B}.${契约名称}.${接口名称}.strategy.name=SessionStickiness
复制代码


为具体的接口指定会话粘滞策略。

总结


Java Chassis 3 通过接口维度负载均衡的策略设置,为不同的应用场景提供了非常强大的负载均衡管理能力,帮助解决负载不均衡、会话粘滞等应用负载问题。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
Java Chassis 3:接口维度负载均衡_Java_华为云开发者联盟_InfoQ写作社区