一致性 Hash 算法的实际应用
前言 记得一年前分享过一篇 《一致性 Hash 算法分析》 ,当时只是分析了这个算法的实现原理、解决了什么问题等。 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的一个路由需求来着手实现一次。 背景 看过 《为自己搭建一个分布式 IM(即时通讯) 系统》 的朋友应该对其中的登录逻辑有所印象。 先给新来的朋友简单介绍下 cim 是干啥的: 其中有一个场景是在客户端登录成功后需要从可用的服务端列表中选择一台服务节点返回给客户端使用。 而这个选择的过程就是一个负载策略的过程;第一版本做的比较简单,默认只支持轮询的方式。 虽然够用,但不够优雅😏。 因此我的规划是内置多种路由策略供使用者根据自己的场景选择,同时提供简单的 API 供用户自定义自己的路由策略。 先来看看一致性 Hash 算法的一些特点: 构造一个 0 ~ 2^32-1 大小的环。 服务节点经过 hash 之后将自身存放到环中的下标中。 客户端根据自身的某些数据 hash 之后也定位到这个环中。 通过顺时针找到离他最近的一个节点,也就是这次路由的服务节点。 考虑到服务节点的个数以及 hash 算法的问题导致环中的数据分布不均匀时引入了虚拟节点。 自定义有序 Map 根据这些客观条件我们很容易想到通过自定义一个 有序 数组来模拟这个环。 这样我们的流程如下: 初始化一个长度为 N 的数组。