如何写一个RPC框架(六):负载均衡
来源:互联网 发布:数据之巅 电子书 编辑:程序博客网 时间:2024/06/11 14:40
在后续一段时间里, 我会写一系列文章来讲述如何实现一个RPC框架(我已经实现了一个示例框架, 代码在我的github上)。 这是系列第六篇文章, 主要讲述了RPC中负载均衡这一块的内容。
常见的LB策略
常见的LB策略有很多:
- RoundRobin (RR): 一个列表中轮着来
- WeightedRoundRobin (WRR): 带权重的RR
- LocalFirst:本地服务优先
- Random:随机选择
- ConsistentHash: 一致性哈希
这些策略中,除了最后一个,别的都很好理解。 下面主要来说一下一致性哈希负载均衡的原理和实现吧。
一致性哈希负载均衡
一致性哈希算法
首先,我们需要去了解什么是一致性哈希算法。网上有很多关于一致性哈希的文章, 在这里我推荐一篇写的比较细致且容易理解的:一致性哈希算法
为什么要用一致性哈希来做负载均衡
假设我们根据userid来做hash,在服务器数量发生变动时,只有少数用户的请求会发送到新的机器上, 这样可以最大程度的利用服务器的本地缓存。
简单实现
一致性哈希算法在我看来只有两个注意点:
- 如何找到某一个hash值在环中的下一个节点
- 如何实现虚拟节点的replica
这两个问题比较好解决:
- 对于第一个问题, 可以利用treemap来实现
- 对于第二个问题, 我们只需要对某一个物理节点的key做多次的【修改key,再hash,再存入treemap中】即可
对应的代码如下:
public interface HashFunction<T> { int hash(T t);}public class ConsistentHash<T> { private final HashFunction hashFunction; private final int numberOfReplicas; private final SortedMap<Integer, T> circle = new TreeMap<>(); public ConsistentHash(HashFunction hashFunction, int numberOfReplicas, Collection<T> nodes) { this.hashFunction = hashFunction; this.numberOfReplicas = numberOfReplicas; for (T node : nodes) { add(node); } } public void add(T node) { for (int i = 0; i <numberOfReplicas; i++) { circle.put(hashFunction.hash(node.toString() + i), node); } } public void remove(T node) { for (int i = 0; i <numberOfReplicas; i++) { circle.remove(hashFunction.hash(node.toString() + i)); } } public T get(Object key) { if (circle.isEmpty()) { return null; } int hash = hashFunction.hash(key); if (!circle.containsKey(hash)) { SortedMap<Integer, T> tailMap = circle.tailMap(hash); hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); } return circle.get(hash); }}
阅读全文
1 0
- 如何写一个RPC框架(六):负载均衡
- 如何写一个RPC框架(五):服务器端实现
- RPC框架之-DUBBO(二)负载均衡
- 【远程调用框架】如何实现一个简单的RPC框架(五)优化三:软负载中心设计与实现
- 一起写RPC框架(二十一)RPC服务消费者三--服务消费者负载策略
- 如何写一个RPC框架(一):关注点与我的实现
- 如何写一个RPC框架(二):利用Bean容器和动态代理简化客户端代码
- 如何写一个RPC框架(三):服务注册与服务发现
- 如何写一个RPC框架(四):网络通信之客户端篇
- JBOSS系列(六)--负载均衡
- 一起写RPC框架(六)RPC网络模块的搭建四 请求响应---异步"表白","同步"Yes,I do
- 如何写一个框架
- 如何实现一个简单的rpc框架
- 如何实现一个分布式 RPC 框架
- 如何实现一个分布式 RPC 框架
- 如何实现一个分布式RPC框架
- 如何实现一个分布式RPC框架
- 如何实现一个分布式 RPC 框架
- 55.Jump Game
- three.js 画一个旋转的立方体
- python 手记9 〖笨方法学python习题30〗
- 教程篇(5.4) NSE4 08. 显式代理 ❀ 飞塔 (Fortinet) 网络安全专家
- java 自我知识总结(十八)final finalize finally
- 如何写一个RPC框架(六):负载均衡
- C#基础之静态类
- $.ajax()方法详解
- SpringBoot与Thymeleaf整合
- 为什么不能打断正在工作的程序员?
- 程序员相关笑话,你看懂几个?
- 我是程序猿,没有秃头,还有女朋友
- C/C++ VS2012及以上添加 Snippet,自定义快捷输入注释
- git初级入门