如何设计实现最基础的分布式应用,我们可以从如下两个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。
分享到:
相关推荐
这些目标反映了分布式系统设计的挑战性和复杂性,因为每一个目标的实现都会涉及到一系列的技术和策略,比如抽象化、模型设计、数据划分以及数据复制等。在分布式系统中,数据划分是为了提高系统的扩展性和性能,而...
在S7系统中,它通过冗余设计、故障检测和自我诊断等功能,实现了这一目标。 首先,分布式架构允许我们将安全功能分布在网络中的各个节点上,而非集中在单一控制器中。这样做的好处在于提高了系统的可靠性和可用性,...
### 基于CORBA的分布式程序设计(入门与提高) #### CORBA概述 CORBA(Common Object Request Broker Architecture)即公共对象请求代理体系结构,是面向对象领域中的一种通用框架,旨在支持分布式环境中不同软件...
另外,本书介绍了 Actor 模型的一个实现框架 Akka 以及它的工具,而后讨论了在充分利用 actor 架构的基础上使用 Akka 框架来设计软件系统的方法,以及使用它来开发并发性和分布式应用程序的方怯。本书还介绍了领域 ...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。...
总结来说,本资源包提供的"多线程入门资料"涵盖了多线程的基本概念、实现方式、线程同步与通信、并发问题及其解决方案,以及分布式锁的原理与实现,是学习Java多线程和分布式系统的好助手。通过深入学习和实践,...
### 分布式系统小书知识点概述 #### 一、引言与目标设定 - **书籍定位**:本书旨在为读者提供一个易于理解的分布式系统入门...书中涵盖了许多关键概念和技术,可以帮助读者建立起坚实的分布式系统设计和实现的基础。
分布式事务是现代计算机系统中处理跨多个服务或数据源事务的一组复杂的...在实现时,开发者还需要考虑多种因素,例如网络延迟、服务可用性、数据一致性和系统复杂性等,这都是分布式事务设计和实现中需要权衡的关键点。
《走向分布式》这本书是一本中文版的分布式系统介绍书籍,内容详尽,入门容易,非常适合初学者学习和掌握分布式系统的基本知识和相关技术。接下来,我们将根据书籍的内容,详细解析分布式系统所涉及的关键知识点。 ...
在分布式环境中,Quartz可以实现集群部署,确保高可用性和容错性。例如,当一个节点失败时,其他节点可以接管Job的执行。不过,需要注意的是,Quartz本身并不直接支持分布式调度,但可以通过与其他工具(如...
在"81程序员练级攻略(2018):分布式架构入门1"中,作者陈皓强调了分布式系统的特点和挑战,并提供了一些学习资源。 分布式系统的核心挑战包括: 1. **网络不稳定**:在实际环境中,网络连接可能出现延迟、丢包或...
为了解决这些问题,本文提出了一种基于分布式架构的物流信息管理平台设计,旨在提高物流信息管理的效率,降低成本,并能应对高并发和大量数据处理的需求。 1. 平台设计 平台主要由四个部分构成:门户网站、中心...
"分布式系统导论"这门课程的目标是为学习者提供关于分布式系统的基本原理、设计模式以及实际应用的入门知识。 课件中可能涵盖以下核心知识点: 1. 分布式系统定义与特性:解释分布式系统的定义,包括其并发性、...
在分布式环境中,由于网络延迟、服务故障等问题,实现事务的ACID(原子性、一致性、隔离性、持久性)特性变得复杂。若依框架通过引入成熟的分布式事务解决方案,如Seata、Atomikos等,来解决这一问题。 3. **若依...
分布式数据共享是分布式系统设计中一个关键的部分,它涉及到如何高效地在多台计算机间传输和同步数据。高效的数据共享不仅涉及到共享机制的设计,还包括数据一致性、容错性、性能优化等多个方面。分布式系统中的数据...
本教程将带你深入理解分布式事务的基础知识,并通过具体的代码示例和完整的文档,让你能够实际操作并掌握分布式事务的实现。 一、分布式事务的定义与必要性 分布式事务是指跨越多个数据库或资源管理器的单一逻辑...
分布式系统的设计和实现涉及到一系列复杂的技术和概念,如集群、分布式存储、分布式计算、分布式数据库、分布式缓存、分布式一致性协议、容错机制等。 分布式系统的基本概念包括但不限于以下几个方面: 一、分布式...
基于C++和QT实现的分布式智能AGV调度系统源码(课程大作业).zip基于C++和QT实现的分布式智能AGV调度系统源码(课程大作业).zip基于C++和QT实现的分布式智能AGV调度系统源码(课程大作业).zip基于C++和QT实现的分布式...
全书总计 8 章,首先简单介绍了分布式系统和分布式数据库的需求,然后讲解了分布式数据库的实现原理,并对市场上存在的各种分布式数据库中间件进行了对比,再围绕着如何利用 Mycat 实现分布式数据库而展开。《分布式...