Pigeon中的负载均衡

一.核心类

LoadBalanceManager 负载均衡的管理器

LoadBalance 负载均衡的抽象

Client 负载均衡调度的对象

二.核心类讲解

2.1 LoadBalanceManager类

核心对象,存储着service&group的组合键 和 负载均衡器的 kv对象

private static Map<String, LoadBalance> loadBalanceMap = new ConcurrentHashMap<String, LoadBalance>();

初始化流程

初始化过程中起了两个线程,用来监控Client的调度参数,这个和Pigeon的调度策略有关。在负载均衡过程中有两个重要的参数weight , capcity

weight是一个相对值,代表者不同机器处理能力的,这个值在服务注册时指定

capcity代表了能处理的请求数量,在之前的请求处理过程中也有描述

因为RPC服务通常处于一个或者多个分布式集群中,需要开启两个线程分别监听这两个参数的改动,从而影响负载均衡的结果

2.2 LoadBalance

负载均衡的接口定义

public Client doSelect(List<Client> clients, InvokerConfig<?> invokerConfig, InvocationRequest request,
int[] weights);
简单的说就是按照负载均衡的策略从一个Client列表中选择一个Client作为访问对象

RandomLoadBalance 实现

代码比较简单,依赖random和weight的一个简单的负载均衡器的实现。个人感觉这里的代码执行效率比较低,改为map的映射来实现更加高效

2.3 Client

Client<C extends Channel> {
  InvocationResponse write(InvocationRequest request) ;

    void processResponse(InvocationResponse response);
}
Client对象通过持有Channel的实例具有了读写能力,主要接口就是发起请求,处理结果

2.4 执行流程
LoadBalance loadBalance  = loadBalanceManager.getLB(serviceKey);
Client client = loadBalance.select(clients,config,request,weightArray);
Response response = client.write(requset);
client.processResponse(response);

真正的执行流程是责任链模式,因此这里仅仅是简化了一个执行流程,将负载均衡的过程梳理清楚

三.补充

负载均衡本质上是一种保证各个服务器提供者之间消费公平的一中路由策略. 避免部分机器过饱和或者部分机器过于饥饿。

所有的代码在Pigeon的route包内

Region也是路由包中的一个重要的组成部分,Region是机房的抽象。RPC的请求耗时组成中网络传输耗时是一个重要的组成部分

public List<Client> getPreferRegionClients(List<Client> clientList, InvocationRequest request);
就是一种优先获取同机房Client的实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值