分布式|优秀!一鼓作气学会“一致性哈希”,就靠这 18 张图了( 四 )
那么如何让这些队列能均匀的分布在这个圆环中呢?还记得我们在苦恼分配信息规则的不断修改时,我们大胆的假设了一个我们的 IM 系统永远也不可能达到的队列数字吗?
我们假设了 MQ 中有 100 个队列,然后,我们去判断这些队列是否真实存在。不存在,我们就顺时针滑动一直找到真实存在的队列为止。
如果我们再大胆一点,偷偷的把我们的假设进一步优化,把一些本来需要判断为不存在的队列去映射到真正已经存在的队列上,那么我们是不是就等于把这些真正存在的队列均匀分布到这个圆环上了?
文章插图
像上图这种,把已经存在的少量队列去映射到多个假设队列的方法,就是一致性哈希的虚拟节点办法。
而对于怎么让少量的队列映射到多个假设队列,是有多种实现算法存在的。
比如,我们可以把真实存在的队列名加上一些编号去分别哈希一下, 像hash(chat00) mod 100,hash(chat00#1) mod 100,然后根据得到的余数,去把 chat00 这个真实队列和对应余数的环中的位置映射上。
如果 hash(chat00) mod 100 = 31,那么 31 号的位置就对应于 chat00,以后所有 m = hash(id) mod 100 中 m = 31的所对应的消息就会直接被发送到 chat00 队列。
而 hash(00#1) mod 100 = 56,则 m = 56对应的消息同样也会直接发送到 chat00 队列。
这样,我们就间接的把 MQ 中的真实存在的队列做了均匀化分布,从而大大减少了信息失衡的现象。
理解算法的思想胜于算法的实现
好了,通过实际场景来对于一致性哈希的思想就暂时剖析到这里了。
一致性哈希作为一种非常经典的算法思想,被广泛的用于各大分布式项目当中,用于解决各种分片问题,任务分发问题。
但是,在这里,我要纠正一个观点:很多人都在网上说 redis 使用了一致性哈希。这是错的,redis 只是使用了一致性哈希的思想。比如一致性哈希中的环分布,再比如虚拟节点对应真实节点的思想。
但是 redis 并没有使用任何哈希算法去计算分布,如果有兴趣的读者,可以仔细去看下有关内容。从 redis 的例子上来说,我们可以看到,只有理解了算法的思想,我们才能更容易更灵活地因地制宜的分解、修正、改进算法,让算法能更切合实际的融入到我们的项目之中。
【 分布式|优秀!一鼓作气学会“一致性哈希”,就靠这 18 张图了】
文章插图
更多阅读推荐
- 表现|表现优秀的骁龙865高端旗舰都有哪些?以下这三款机型入手不亏!
- 分布式锁的这三种实现90%的人都不知道
- 巨杉亮相 DTCC2019,引领分布式数据库未来发展
- Martian框架发布 3.0.3 版本,Redis分布式锁
- 为什么分布式应用程序需要依赖管理?
- 大规模分布式强化学习基础架构Menger, 大幅提高真实任务的学习效率
- 分布式云对智能化战争有何影响
- vivo Y73s评测:轻巧无负担兼具优秀体验
- 四核强性能,华硕XD4灵耀AX魔方分布式路由评测
- 优秀软件设计的基本元素是什么?