本节在《代理》和《连接池》的基础上加上负载均衡,主要的思路是在代理上加上集群服务的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工程。
相关推荐
在"Apache Thrift 初学小讲(五)【代理】"这篇博文中,我们将探讨Thrift如何实现代理服务,这在分布式系统中非常关键,因为代理可以提供负载均衡、安全控制、监控等功能。 1. **接口定义语言(IDL)**:Thrift ...
在“Apache Thrift 初学小讲(三)【http】”中,我们将深入探讨Thrift如何与HTTP协议相结合,实现基于HTTP的服务通信。 首先,Thrift 提供了一个名为 `ThriftServlet` 的组件,它是将Thrift服务与Java Servlet容器...
Apache Thrift 是一个开源的软件框架,用于构建可伸缩的、跨语言的服务。它结合了接口定义语言(IDL)和库,允许开发者定义数据结构和服务接口,然后自动生成多种编程语言的代码,使得不同语言之间可以高效地进行...
1. **分布式架构**:Cassandra采用了无中心节点的分布式架构,每个节点都与其他节点对等通信,允许数据复制和负载均衡。这种设计使得系统能够容忍节点故障,保证服务的高可用性。 2. **一致性与可用性**:Cassandra...
内容涵盖了从基础的安装部署、配置方法到复杂的集群容错策略、负载均衡技术、服务治理等高级特性。 从给出的《dubbo用户指南》部分内容来看,这份指南包含了以下几个重要的知识点: 1. Dubbo的基本需求:随着...
9. **负载均衡**:Nginx和HAProxy等负载均衡器可以将请求分发到不同的服务器,确保资源的有效利用。 10. **监控和日志**:ELK(Elasticsearch、Logstash、Kibana)堆栈和Prometheus+Grafana组合是常见的监控和日志...
在分布式系统中,核心的概念包括并发控制、一致性模型、容错机制、负载均衡、分布式数据存储以及网络通信协议等。这些概念构成了分布式系统的基石,对于理解和设计大规模、高可用的互联网服务至关重要。 并发控制...
4. Region管理和负载均衡:了解Region的工作原理,以及如何调整和优化Region分布。 5. 容错和恢复:如何处理服务器故障,以及数据的备份和恢复策略。 6. 性能调优:监控工具、性能指标以及优化技巧,以提高系统性能...
4. **Region管理和负载均衡**:理解Region的生命周期、分裂机制以及如何优化Region Server的负载。 5. **HBase读写流程**:深入解析数据的写入过程(包括WAL日志、MemStore和HFile)、读取流程以及一致性保证。 6....
HRegion是HBase中分布式存储和负载均衡的最小单元。不同的HRegion可以分布在不同的HRegionServer上,但一个HRegion不会拆分到多个Server上。 HBase适合于多种应用场景,包括互联网搜索引擎数据存储、海量数据写入、...
HRegion是HBase分布式存储和负载均衡的最小单元,保证了HBase的高效数据操作和分布特性。 HBase应用场景广泛,包括但不限于互联网搜索引擎数据存储、海量数据写入、消息中心、内容服务系统(schema-free)、大表的...
14. 集群和容错处理:描述了Dubbo中的集群机制,包括路由服务、负载均衡策略(如RandomLoadBalance、RoundRobinLoadBalance等)以及集群的配置规则。 15. 监控:探讨了Dubbo的监控中心实现,包括监控数据的产生、...
1. **Dubbo**:Dubbo是阿里巴巴开源的高性能RPC框架,它提供了服务治理、动态配置、熔断、负载均衡等功能,支持多种协议,如HTTP、RMI、Hessian、Thrift等。 2. **服务注册与发现**:Zookeeper作为服务注册中心,...
它通常包括各个服务组件、数据流、通信协议、负载均衡策略、故障恢复机制等元素,帮助开发者理解和维护整个系统。 在Java中实现分布式系统,我们首先需要理解微服务架构,这是一种将单一应用程序划分为一组小型服务...
Region可以跨服务器分布,以达到负载均衡的目的。 - **Store概念**: Store是Region内部的存储单位,每个Store对应一个列族。 - **StoreFile与MemStore**: - **StoreFile**: 存储压缩后的数据文件,位于磁盘上。 - ...