Apache Thrift 初学小讲(七)【负载均衡】

本节在《代理》和《连接池》的基础上加上负载均衡,主要的思路是在代理上加上集群服务的n个连接池,客户端连接到代理上,代理转发时根据负载均衡算法选择一个合适连接池中的连接:

 


 

一般的负载均衡算法有:

1 [加权]轮询法([Weight] Round Robin),

2 [加权]随机法([Weight] Random),

3 源地址哈希法(Hash),

4 [加权]最小连接数法([Weight] Least Connections)。

 

这里只实现加权最小连接数法:least_conn算法很简单,首选遍历后端集群,比较每个后端的conns/weight,选取该值最小的后端。如果有多个后端的conns/weight值同为最小的,那么对它们采用加权轮询算法。

 

首先在ConnectionPoolFactory.java加上计算该连接池的权重值的方法:

//取得权重值
public double getWeight() {
	//活动的连接数 除以 最大连接数
	double numActive = pool.getNumActive(); 
	double maxTotal = pool.getMaxTotal();
	System.out.println(numActive + "**" + maxTotal); 
	return numActive / maxTotal;
}

 

然后在ThirftProxy.java加上如下代码,其中getLeastConnPoolFactory就是least_conn算法的实现:

private static List<ConnectionPoolFactory> poolFactorys = new ArrayList<ConnectionPoolFactory>();
	
static {
	GenericObjectPoolConfig config = new GenericObjectPoolConfig();
	//链接池中最大连接数,默认为8
	config.setMaxTotal(2); 
	//当连接池资源耗尽时,调用者最大阻塞的时间,超时将跑出异常。单位:毫秒;默认为-1,表示永不超时
	config.setMaxWaitMillis(3000);
	ConnectionPoolFactory poolFactory = new ConnectionPoolFactory(config, "127.0.0.1", 9090); 
	poolFactorys.add(poolFactory);
	poolFactory = new ConnectionPoolFactory(config, "127.0.0.1", 9091);
	poolFactorys.add(poolFactory);
}

public static ConnectionPoolFactory getLeastConnPoolFactory() {
	ConnectionPoolFactory selectPoolFactory = poolFactorys.get(0);
	double selectWeight = selectPoolFactory.getWeight();
	
	for (int i = 1; i < poolFactorys.size(); i++) {
		ConnectionPoolFactory poolFactory = poolFactorys.get(i);
		double weight = poolFactory.getWeight();
		System.out.println(selectWeight + "--" + weight);
		//这里为了简单,没有实现:如果有多个后端的conns/weight值同为最小的,那么对它们采用加权轮询算法
		if ( weight < selectWeight ) {
			selectPoolFactory = poolFactory;
			selectWeight = weight;
		}
	}
	
	return selectPoolFactory;
}

 

最后在ProxyProcessor的process要转发的时候用getLeastConnPoolFactory取得连接:

//转发请求
ConnectionPoolFactory poolFactory = getLeastConnPoolFactory();
TTransport transport = poolFactory.getConnection();

 

工程结构图:


 

启动两个服务TestServer,端口分别是9090和9091,并发的执行TestClient,结果如预期。

 

几种简单的负载均衡算法及其Java代码实现:http://www.cnblogs.com/szlbm/p/5588555.html

 

附件是整个eclipse工程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值