Pigeon中的负载均衡

来源:互联网 发布:遇见这软件靠谱吗 编辑:程序博客网 时间:2024/06/16 09:12

一.核心类

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
原创粉丝点击