.net的一致性哈希实现
最近在项目的微服务架构推进过程中,一个新的服务需要动态伸缩的弹性部署,所有容器化示例组成一个大的工作集群,以分布式处理的方式来完成一项工作,在集群中所有节点的任务分配过程中,由于集群工作节点需要动态增减,因此需要利用etcd(或zk)来管理集群,同时用一致性哈希算法来定位每个工作项的具体工作节点,一致性哈希算法的实现(.NET)为如下地址:
https://github.com/cerasumat/ConsistentHash/tree/develop
算法的原理不再赘述,用baidu都能够在第一页直接检索到,原理很简单,这个实现中哈希空间只有2^32-1,已经能够满足我的业务场景(只处理最近某一段时长的对象实体,这个空间已够用)。源码也很简单,结合原理中那个桶的图示,一看就明白。
简单说说用法:
1:以物理节点初始化哈希路由器
PhysicalNode node1 = ); PhysicalNode node2 = ); PhysicalNode node3 = );
var pNodes = new List<PhysicalNode>();
pNodes.Add(node1);
pNodes.Add(node2);
pNodes.Add(node3);
var router = new Router(pNodes, 3);
初始化得到一个物理节点*虚拟副本数的虚拟节点集群,分布在哈希环上
2:以该路由器提供的GetNode方法,对目标资源进行哈希路由
;
;
;
Stopwatch sw = new Stopwatch();
sw.Start();
; i < ; i++)
{
, '));
var node = router.GetNode(dataKey);
switch (node.Ip)
{
case "10.202.1.1":
Interlocked.Increment(ref count85);
break;
case "10.202.1.2":
Interlocked.Increment(ref count86);
break;
case "10.202.1.3":
Interlocked.Increment(ref count87);
break;
}
}
sw.Stop();
TimeSpan elapse = sw.Elapsed;
int total = count85 + count86 + count87;
Assert.IsTrue(total == );
上述代码只是UT代码中的片段,主要测试用第1步获取的router对99999个key进行哈希定位的耗时(在我笔记本上500ms左右)以及目标keys是否无遗漏地分布到每个节点。
3:集群动态伸缩
IRouter提供了集群伸缩的接口(AddNode,RemoveNode)等,可供使用过程中集群动态伸缩需求使用(可以考虑采取监控etcd或zookeeper中集群信息的方式来实时更新当前集群信息,达到动态伸缩的目的,具体实现这篇帖子不再表述)
以上就是一致性哈希算法的一个简单实现,可根据实际需求引入项目使用,适用于分布式处理的场景。
.net的一致性哈希实现的更多相关文章
- 一致性哈希算法与Java实现
原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- 五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...
- 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法
1 网络IO模型 安装memcached需要先安装libevent Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描 ...
- 一致性哈希算法以及其PHP实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...
- Java_一致性哈希算法与Java实现
摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- Memcached 笔记与总结(8)Memcached 的普通哈希分布算法和一致性哈希分布算法命中率对比
准备工作: ① 配置文件 config.php ② 封装 Memcached 类 hash.class.php,包含普通哈希算法(取模)和一致性哈希算法 ③ 初始化 Memcached 节点信息 in ...
- 一致性哈希算法(consistent hashing)【转】
一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...
- 一致性哈希算法学习及JAVA代码实现分析
1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...
随机推荐
- 【原创】C#模拟Post请求,正文为json数据的代码参考
由于之前一直在做键值对post数据的提交,没遇到过json正文的提交,遇到的问题截图: 对于此种情况的post,我用 谷歌插件 PostMan 模拟试了下成功了,截图如下: Postman插件在你选择 ...
- ListView初探
一.ListView介绍 在Android开发中ListView是比较常用的控件,常用于以列表的形式显示数据集及根据数据的长度自适应显示. ListView通常有两个主要功能点: (1)将数据集填充到 ...
- redis incr incrby decr decrby命令
incr.incrby.decr.decrby命令的作用和用法 redis中incr.incrby.decr.decrby属于string数据结构,它们是原子性递增或递减操作. incr递增1并返回递 ...
- 数据结构:二叉树 基于list实现(python版)
基于python的list实现二叉树 #!/usr/bin/env python # -*- coding:utf-8 -*- class BinTreeValueError(ValueError): ...
- SAP CRM BOL编程基础,代码+详细注释
网络上可以找到一些使用BOL查询.维护数据的DEMO,但几乎都是单纯的代码,缺乏说明,难以理解.本文除了代码外,还给出了详细的注释,有助于理解BOL编程中的一些基本概念. 这是一篇翻译的文章,你可能会 ...
- Java之this关键字的用法
Java 中的 this 关键字指当前的对象,可以直接用其调用当前对象的成员变量,也可以直接用其调用当前对象的成员方法,这是我们常见的场景,那么有没有其它的情况呢! this 还可以在无参的构造方法中 ...
- Appfuse:扩展自己的GenericManager
通过代码生成机制的appfuse访问数据都通过GenericManager来实现,GenericManager默认提供了以下几个方法: package org.appfuse.service; imp ...
- Extjs5 tabs实例
<%@ page language= "java" contentType ="text/html; charset=UTF-8" pageEnc ...
- [Erlang 0119] Erlang OTP 源码阅读指引
上周Erlang讨论群里面提到lists的++实现,争论大多基于猜测,其实打开代码看一下就都明了.贴出代码截图后有同学问这代码是哪里找的? "代码去哪里找?",关于Erla ...
- SQL Server 2012新增和改动DMV
SQL Server 2012新增和改动DMV 系统视图 说明 sys.dm_exec_query_stats (Transact-SQL) 添加了四列,以帮助排除长时间运行的查询所存在的问题. 可 ...