目录
内容概述
列举常见的几种路由算法以及基本思路。
随机选择
随机数作为节点数组索引
轮询 roundribbon
按照节点集合顺序依次返回
取模 mod
- 节点信息数组nodes
- index=key%nodes.length
- 命中nodes[index]
权重
- 每个节点的权重映射为一个数字逻辑区间,如[A(上个权重逻辑区间上限),B(A+权重))
- 通过随机数选择命中区间
- 获得本次路由节点
计算区间时可将权重适当扩大,例如权重都是两位小数,则可扩大100倍,即.25扩大为25。
举例
N1,权重2;N2,权重4
N1对应区间[0,2),即0、1
N2对应区间[2,6),即2、3、4、5
获取随机整数,例如3
随机数3对应N2区间,则选择N2节点。
一致性hash算法
优点
- 增减服务器后,不会造成大量key迁移。
对数据结构的要求
- 要求路由结果稳定且时间复杂度不高。
why选择TreeMap数据结构
- 稳定 红黑树,具有集合的sorted order特性
- 时间复杂度log(N)
大致流程
- 每次路由都需要重建ring,根据"真实节点信息"创建虚拟Node
- 虚拟node的key:真实ID+"_"+虚拟节点index,如"123456_0"、"123456_1",然后进行hash。
- 虚拟node的val为真实节点信息
- 获取大于"待路由key"的节点构成的sortedMap,即treeMap.tailMap(key)
- 获取距离"待路由key"最近的虚拟节点的key,即sortedMap.isNotEmpty() ? sortedMap.firstKey() : ring.firstKey()
- key-->虚拟节点-->虚拟节点的val