如何设计实现最基础的分布式应用,我们可以从如下两个ID入手:一个是全球唯一标识,另一个分布式hash散列值。
前一个保证你各个服务器之间产生的不通ID是不重复的,因为它的主要算法是跟时间和MAC地址有关的,后一个决定你
的数据是分发给哪台服务器处理。
对GUID不是太理解的可以看如下一段(摘抄自杂志):
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs)。
一般我们在分布式系统中用guid做主键,而在列中增加一个 id_hash来保存期hash值。
一.guid 如何实现
JAVA uitil中采用了统一的实现,参看
System.out.println(UUID.randomUUID().toString());
结果
1a078dc9-df28-4841-ad7a-00214f8a5ea7
二.hash值如何实现。
/**
*
* @param str 需要散列的字符串
* @param mode 散列度
* @return
*/
public static int getStringHashValue(String str,int mode){
Assert.notNull(str,"the hashString must not be null");
int val=str.hashCode();
if(val==Integer.MIN_VALUE) return 0;//处理当hashCode返回MIN_VALUE,abs为负的情况
return Math.abs(val)%mode;
};
System.out.println("the string 'abc' hash value = "+getStringHashValue("abc",mode));
System.out.println("the string 'abc' hash value = "+getStringHashValue("abc",mode));
结果:
the string 'abc' hash value = 303
the string 'abc' hash value = 303
上面可以看到,满足一致性规则,相同的string产生了相同的hash值,这就保证了相同ID的用户分布到相同的机器上,满足了不同用户数据的隔离。
三.不同线程取数据如何隔离
通过hashStart 和 hashEnd 来分段取数据。例如:
searchParams.put("hashStart", profile.getHashStart());
searchParams.put("hashEnd", profile.getHashEnd());
searchParams.put("total", threadDataTotalInt);
searchParams.put("collectType", BillingConstants.COLLECT_TYPE_INC);
List<BillingCollectBean> collects = billingCollectService.getIncCollectBeans(searchParams);
profile.getHashStart()和profile.getHashEnd()通过antx配置,不同的机器配置不同的hash区段。
为满足平行扩展,我们最好将这些信息配置在数据库,通过读取数据库,自动取到自己的机器到底该处理哪些区段的纪录,
hash值散列时,mod取值可以根据机器数量和数据数进行设置,最好取的大一点,这样可以保证散列的均匀,同时粒度变的细小也便于控制(如果只有2,那最多可以给两个机器使用)。我们系统目前设置为1000。
分享到:
相关推荐
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。《分布式...
课程作业基于c和c++实现的轻型分布式文件系统源码(含说明文件).tar课程作业基于c和c++实现的轻型分布式文件系统源码(含说明文件).tar 轻型分布式文件系统 * 基于 C++ 实现的分布式文件系统,将文件切分成 2MB 大小...
本书以0.10版本的源码为基础,深入分析了Kafka的设计与实现,包括生产者和消费者的消息处理流程,新旧消费者不同的设计方式,存储层的实现,协调者和控制器如何确保Kafka集群的分布式和容错特性,两种同步集群工具...
本书以0.10版本的源码为基础,深入分析了Kafka的设计与实现,包括生产者和消费者的消息处理流程,新旧消费者不同的设计方式,存储层的实现,协调者和控制器如何确保Kafka集群的分布式和容错特性,两种同步集群工具...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。《分布式...
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,是Google的Chubby一个开源的实现。提供功能:命名服务配置管理集群管理分布式锁队列管理特性:顺序一致性:从同一个客户端发起的事务请求,...
基于Spring4.0设计,其不仅继承了Spring框架原来有的优秀特性,而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在原本的Spring中由于随着项目的扩大导入的jar包数量越来越大,随之出现...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。《分布式...
可以大幅度简化应用服务器的开发,无须在建立COM+/SOAP Server应用上花费任何时间,也不需要费心管理数据库事务,只要具备熟练运用SQL的能力,理解SQL参数匹配规则即可写出复杂的分布式应用服务,使得入门级程序员也...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。《分布式...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。《分布式...
课程实验基于Java实现的分布式存储系统源码+项目说明.tar 项目概述与技术点: * 参照**GFS**(Google File System)中心化思想自主完成系统架构设计,完成技术方案编写 * 基于文件元数据服务实现**自定义注册中心**,...
类似与京东、天猫商城,其打造的是商业模式为“社区+电子商务”, 用户不只是在社区中有自己的圈子,还可以将电商加入到社区中,整个电商网站实现的功能非常之多,采用分布式的系统架构设计,包括后台管理、前台系统...
这是一个shiro的入门Demo.. 使用了Spring MVC,mybaits等技术.. 数据库设计 : User : name--password Role : id--userid--roleName Function : id--userid--url tinys普通用户只能访问index.jsp admin用户通过添加...
braft是为要求高工作量和低延迟开销的方案设计和实现的,并考虑了易于理解的概念,以便百度内部的工程师可以正确,正确地构建自己的分布式系统。 它在百度内部广泛用于构建高可用性系统,例如: 存储系统:键值,...
一、分布式计算开源框架Hadoop实践在SIP项目设计的过程中,对于它庞大的日志在开始时就考虑使用任务分解的多线程处理模式来分析统计,在我从前写的文章《TigerConcurrentPractice--日志分析并行分解设计与实现》中...
Java基于Netty实现的高性能分布式IM即时通信系统源码+项目说明.tar 介绍 `RIM`是基于Netty实现的面相开发者的高性能分布式即时通信系统,保证消息的实时性、有序性、可靠性。 ## 技术栈 | 名称 | 作用 | | -------...