对三种典型分布式任务分配算法的分析

合集下载

分布式计算系统中的任务调度算法比较研究

分布式计算系统中的任务调度算法比较研究

分布式计算系统中的任务调度算法比较研究随着计算机技术的快速发展和云计算的兴起,分布式计算系统已经成为了处理大规模计算和数据处理任务的关键技术。

在这样的系统中,任务调度算法起着至关重要的作用,决定了任务的执行效率、资源利用率和系统的性能表现。

本文将对分布式计算系统中常见的任务调度算法进行比较研究,评估各算法的优缺点和适用场景。

1. 先来先服务调度算法(First-Come-First-Serve, FCFS)先来先服务调度算法是最简单和最常用的一种任务调度算法。

该算法根据任务到达的顺序进行调度,即先到的任务会先被执行。

虽然实现简单,但由于没有考虑任务的优先级和各任务的执行时间,可能导致长任务阻塞短任务,从而降低系统的性能。

2. 轮转调度算法(Round Robin, RR)轮转调度算法将所有任务按照顺序轮流执行,每个任务被分配一个时间片段,当时间片用尽时,任务会被暂停并放入队列的末尾,等待下一次调度。

轮转调度算法能够公平地分配资源,适用于任务执行时间较为均匀的情况。

然而,在任务执行时间差异较大的情况下,该算法可能导致长任务执行时间较长,影响整体系统的响应时间。

3. 最短作业优先调度算法(Shortest Job First, SJF)最短作业优先调度算法是根据任务的执行时间进行调度的算法,即优先执行执行时间最短的任务。

该算法可以最大程度上减少平均等待时间和执行时间,提高整体系统的性能。

然而,由于无法准确预测任务的执行时间,该算法很难在实际场景中得到广泛应用。

4. 最高响应比优先调度算法(Highest Response Ratio Next, HRRN)最高响应比优先调度算法是综合考虑任务等待时间和任务执行时间的算法。

它通过计算任务的响应比来确定下一个应该执行的任务。

响应比定义为任务等待时间与任务执行时间之和的比值,较高的响应比意味着更紧迫的任务。

该算法优先执行响应比最高的任务,能够改善长任务等待时间过长的问题。

分布式系统中的任务调度算法

分布式系统中的任务调度算法

分布式系统中的任务调度算法1. 轮询调度算法(Round Robin):将任务按顺序分配给所有可用的计算节点,每个节点依次接收任务直到全部节点都接收到任务,然后重新开始分配。

这种调度算法简单易实现,但不能根据节点负载情况做出合理调度决策。

2. 随机调度算法(Random):随机选择一个可用的计算节点,将任务分配给它。

这种调度算法简单高效,但不能保证节点的负载平衡。

3. 加权轮询调度算法(Weighted Round Robin):为每个计算节点设置一个权重值,根据权重值的大小将任务分配给相应的计算节点。

这种调度算法可以根据节点的性能和资源情况进行灵活调整,实现负载均衡。

4. 最小任务数优先算法(Least Task First):选择当前任务最少的计算节点,将任务分配给它。

这种调度算法可以实现最小负载优先策略,但不能考虑计算节点的性能差异。

1. 最短任务时间优先算法(Shortest Job First):根据任务的处理时间,选择处理时间最短的计算节点,将任务分配给它。

这种调度算法可以最小化任务的执行时间,但无法适应节点负载波动的情况。

2. 最靠近平均负载算法(Nearest Load First):选择负载最接近平均负载的计算节点,将任务分配给它。

这种调度算法可以实现负载均衡,但每次任务调度需要计算计算节点的负载,并更新平均负载值,造成一定的开销。

3. 动态加权轮询调度算法(Dynamic Weighted Round Robin):根据各个计算节点的负载情况动态调整其权重值,实现负载均衡。

这种调度算法能够根据系统负载情况作出灵活调度决策,并适应系统负载波动的情况。

4. 自适应任务调度算法(Adaptive Task Scheduling):根据任务的执行状态动态调整任务分配策略。

这种调度算法可以根据任务执行情况实时调整任务分配,提高系统的性能和吞吐量。

1.基于遗传算法的任务调度算法:将任务调度问题建模为一个优化问题,并使用遗传算法等优化算法进行求解。

分布式计算系统中的任务调度算法分析与改进

分布式计算系统中的任务调度算法分析与改进

分布式计算系统中的任务调度算法分析与改进在分布式计算系统中,任务调度算法扮演着重要的角色。

任务调度算法的性能直接影响着整个系统的效率和吞吐量。

在本文中,我们将对分布式计算系统中的任务调度算法进行分析,并提出改进方案,以进一步提高系统的性能和可靠性。

一、任务调度算法的分析在分布式计算系统中,任务调度算法的主要目标是合理地分配任务到不同的计算节点,以最大化系统的吞吐量或者减少任务完成时间。

下面我们将分析两种常用的任务调度算法:静态调度算法和动态调度算法。

1. 静态调度算法静态调度算法指的是在任务提交之前就对任务进行静态的分配和调度。

常见的静态调度算法有轮转法、最小平均完成时间算法和最小任务完全时间算法。

轮转法是一种简单的静态调度算法,它按照任务的到达顺序将任务分配给计算节点。

这种算法的优点是实现简单,但它没有考虑到节点之间的负载情况,会导致一些节点负载过重,而其他节点处于空闲状态。

最小平均完成时间算法(MAFT)是一种静态调度算法,它优先选择平均完成时间最短的计算节点来执行任务。

这种算法考虑了节点之间的负载情况,但是没有考虑任务的紧急程度和执行时间的波动性。

最小任务完全时间算法(MTFT)是一种静态调度算法,它选择任务完全时间最短的计算节点来执行任务。

该算法综合考虑了负载情况、任务的紧急程度和执行时间的波动性,但是在实际应用中,由于任务的完全时间难以准确估计,该算法不太实用。

2. 动态调度算法动态调度算法指的是在任务执行过程中根据系统实时状态来对任务进行动态的分配和调度。

常见的动态调度算法有最小平均剩余时间算法和最小开销剩余时间算法。

最小平均剩余时间算法(MART)是一种动态调度算法,它每次选择平均剩余时间最短的计算节点来执行任务。

该算法考虑了节点的负载情况和任务的剩余执行时间,能够有效地提高系统的性能。

最小开销剩余时间算法(MOST)是一种动态调度算法,它每次选择开销剩余时间最短的计算节点来执行任务。

分布式计算系统中的任务调度优化算法

分布式计算系统中的任务调度优化算法

分布式计算系统中的任务调度优化算法一、引言随着互联网技术不断发展,分布式计算成为了大规模计算的主流方式。

分布式计算系统的优点在于它能够将计算任务分散到多个节点进行计算,多节点协同工作,从而实现计算任务的快速完成。

然而,分布式计算系统中的任务调度问题却是一个极其大的挑战,合理的任务调度能够使分布式计算系统的性能得以优化,进而提升分布式计算的效率。

二、分布式计算系统的任务调度问题在分布式计算系统中,任务调度因素直接影响分布式计算系统的运行效率。

任务调度质量的高低直接关系着分布式计算系统整体性能,同时也影响着计算任务和计算节点的负载均衡。

优秀的任务调度算法可以有效提高分布式计算系统的效率,并且减少任务执行所需的时间。

任务调度问题所涉及的计算模型可归纳为状态映射、执行模式以及资源管理。

三、分布式计算系统中的任务调度算法3.1.基于遗传算法的任务调度优化算法遗传算法是一种基于自我适应的优化算法,该算法的基本思想来自于生物学中基因遗传和进化的过程。

利用遗传算法对任务进行调度是一种有效的方式。

遗传算法可以形成一个任务调度优化模型,该模型中涉及两个基因,一个代表任务的处理节点,另一个代表任务的处理时间。

通过使用遗传算法对任务分配进行优化,从而实现了任务分配的最优解。

3.2.基于贪心算法的任务调度优化算法贪心算法是一种求解问题的方法,在这个算法中,每一次决策只考虑当前状态能够得到的最优解,而不考虑全局最优解。

该算法简单且高效,并且能够在短时间内完成任务调度。

贪心算法通过调整节点的优先级,使得任务调度时尽可能避免出现负载不均衡的情况。

3.3.基于模拟退火的任务调度优化算法模拟退火算法是一种求解优化问题的方法,它采用模拟物理退火的过程进行问题求解。

相比于其他优化算法,模拟退火算法在处理任务调度问题时具有广泛的适用性,它能够在最短的时间内得到全局最优解,同时也能够保证计算节点的负载均衡。

在实际应用中,模拟退火算法可以通过设置初始温度和温度下降规律等参数进行优化。

对三种典型分布式任务分配算法的分析_何炎祥

对三种典型分布式任务分配算法的分析_何炎祥

第18卷 第11期小型微型计算机系统Vo l.18N o.11 1997年11月M IN I-M I CR O SY ST EM S No v.1997对三种典型分布式任务分配算法的分析*何炎祥 罗先林 吴 思 彭堂玉 祝向幸(武汉大学计算机科学与技术学院 武汉430072)摘 要 本文先分析了基于图论的分配算法,整数规划方法和试探法等几种典型的分布式任务分配算法的基本思想、特点,不足和算法复杂度,以及可进一步改进之处,然后给出了一种试探法的改进算法,并简单讨论了其特点和性能,最后指出了分布式任务分配的发展方向。

关键词 通信开销,执行开销,负载平衡,合一,试探法在分布式系统中非同居模块间的数据传递产生处理机间的通信,这种机间通信可能使得增加处理机数目反而会引起系统吞吐量的降低,即产生“饱和效应”。

为降低饱和效应,人们倾向于把模块分配到尽可能少的处理机上,但这又导致系统负载不平衡,从而降低了系统的吞吐量。

显然,这是任务分配中相互冲突的两个方面,不同的任务分配算法试图用不同的策略来平衡这两个方面。

传统的分布式任务分配算法大致可分为三类:基于图论的分配算法,整数规划方法和试探法。

这三类算法并非互斥的,一类算法中往往可以借鉴其它方法中的某些技术。

下面,我们先对这三类典型算法进行分析和比较,然后给出一种试探法的改进算法。

在讨论中,我们假定提交的任务已分解成一组模块并使模块间的通信量尽可能小。

还假定分配模式为:一任务被分解成m个模块T={t1,t2,…,t m},系统中有n个可利用的处理机P={p1,p2,…,p n}。

任务分配的目的就是将这m个模块分配到n个处理机上,使预期的性能目标函数值最小。

1 对三种典型算法的分析1.1 基于图论的分配算法基本思想是给定矩阵C mxm表示模块间的通信开销:C={c i,j 1≤i≤m&1≤j≤m&c i,j为t i与t j间的通信量}给定矩阵Q mxn表示模块的执行开销:Q={q i,j 1≤i≤m&1≤j≤n&q i,j为t i在p j上的执行开销}将模块t1,t2,…,t m作为图中结点,若两模块间有数据传递,则相应结点间有一条无向边,1996-04-26收稿 *软件工程国家重点实验室开放基金部分资助。

分布式计算算法

分布式计算算法

分布式计算算法分布式计算是一种计算方法,它可以将一个大的计算任务分解成许多小的部分,然后将这些部分分配给多台计算机进行处理。

这种方法可以提高计算效率,因为它可以利用多台计算机的并行处理能力。

分布式计算算法的设计需要考虑到如何将任务分配给各个计算机,如何协调各个计算机之间的通信和协作,以及如何处理分布式计算中的数据一致性和错误恢复等问题。

分布式计算算法可以根据其应用场景和数据处理方式的不同,采用不同的设计方法和技术。

其中一些常见的分布式计算算法包括:1. MapReduce:这是一种常见的分布式计算算法,它将一个大型任务分解成许多小的Map任务,并将这些任务分配给各个计算机进行处理。

然后,通过Reduce阶段将各个计算机的处理结果进行汇总和整合,得到最终的输出结果。

2. Flink:Flink是一种流处理框架,它支持大规模的流处理和批处理任务。

Flink通过数据流的方式将任务分配给各个计算机进行处理,并支持实时流处理和批处理之间的无缝切换。

3. Hadoop:Hadoop是一种分布式计算框架,它使用MapReduce算法进行大规模数据的分布式处理。

Hadoop可以处理海量数据,并且可以跨多个计算机集群进行并行处理。

4. Spark:Spark是一种通用的分布式计算框架,它支持大规模的数据处理和分析。

Spark提供了丰富的数据操作函数和转换操作,并可以在多个计算机集群上进行并行处理。

5. DAG(有向无环图)计算:这种分布式计算算法通过将任务分解成多个子任务,并使用有向无环图的方式将各个子任务连接起来,形成一个完整的计算流程。

DAG计算可以更好地利用并行处理能力,并支持更复杂的计算任务。

以上是一些常见的分布式计算算法,它们各自具有不同的特点和适用场景。

在实际应用中,需要根据具体的需求和场景选择合适的分布式计算算法。

分布式计算中的数据划分与任务分配算法研究

分布式计算中的数据划分与任务分配算法研究

分布式计算中的数据划分与任务分配算法研究随着计算机技术的日益发展和计算资源的不断增加,分布式计算已成为一种高效、可靠且可扩展的处理大规模数据和复杂任务的方式。

在分布式计算系统中,数据划分和任务分配是关键问题,影响着整个系统的性能和效率。

因此,研究如何进行数据划分和任务分配的算法显得尤为重要。

数据划分是将大规模的数据集合拆分成可以同时处理的子数据集合的过程。

合理的数据划分可以减少数据传输和处理的开销,提高计算效率和整体性能。

常见的数据划分算法有:哈希划分、范围划分和基于属性的划分。

哈希划分算法将数据集中的数据项通过散列函数映射到给定数量的区域中。

它的优势在于不需要额外的数据访问,而且适用于多维数据和变化较大的数据。

然而,哈希划分容易导致数据倾斜问题,即一部分区域的数据量过大,而另一部分区域则较少。

范围划分算法将数据集中的数据按照设定的范围条件进行划分。

它的优势在于可以根据数据集的特性进行校准,使得每个区域的数据量相对平均。

但是,在动态数据和数据分布随机的情况下,范围划分算法可能会导致数据不均衡的问题。

基于属性的划分算法根据数据项的属性值进行拆分,以确保每个分区中的数据具有相似的特点。

这种划分算法适用于属性值相对均匀分布的数据集,但可能受限于属性的数量和类型。

任务分配是将计算任务分配给分布式计算系统中的节点,以实现任务的并行计算。

合理的任务分配可以充分利用每个节点的计算资源,提高系统的整体性能。

常见的任务分配算法有:静态分配、动态分配和自适应分配。

静态分配算法在系统初始化阶段将任务分配给每个节点,并在整个计算过程中保持不变。

这种算法简单、容易实现,但可能导致负载不均衡和资源浪费的问题。

动态分配算法根据系统当前的负载和节点的计算能力进行任务分配。

它可以根据需要调整任务的分配,以实现负载均衡和资源最优化。

但是,动态分配算法的实现较为复杂,需要考虑节点的负载和通信开销。

自适应分配算法根据任务的性质和节点的特点,动态调整任务的分配策略。

常见的分布式算法

常见的分布式算法

常见的分布式算法分布式算法是一种能够处理大规模分布式系统的算法。

随着云计算和大数据的不断发展,分布式算法也逐渐成为了计算机科学领域的热门研究方向。

本文将介绍几种常见的分布式算法。

1. Paxos算法Paxos算法是一种用于解决分布式一致性问题的经典算法。

它能够确保在一个分布式环境中,多个进程能够达成一致的决策,即使发生网络故障或进程崩溃等异常情况。

Paxos算法被广泛应用于分布式数据库、分布式文件系统等领域。

2. Raft算法Raft算法是一种新兴的分布式一致性算法,它与Paxos算法类似,但更易于理解和实现。

Raft算法的设计目标是使分布式系统的可理解性更高,从而降低系统实现和维护的难度。

因此,Raft算法在近年来得到了广泛的关注和应用。

3. MapReduce算法MapReduce算法是一种用于处理大规模数据的分布式算法。

它通过将大规模数据分解成多个小数据块,并将这些数据块分散到多个计算机节点上进行并行计算,从而实现高效的数据处理。

MapReduce算法被广泛应用于搜索引擎、数据仓库等领域。

4. Gossip算法Gossip算法是一种用于分布式信息传播的算法。

它通过模拟人类社交网络中的信息传播行为,实现分布式节点之间的信息传输和共享。

Gossip算法在分布式系统中具有很高的可扩展性和容错性,因此在云计算、分布式数据库等领域得到了广泛应用。

总之,分布式算法是一种非常重要的计算机科学研究方向,它能够提高分布式系统的可扩展性、可靠性和性能。

通过学习和应用以上几种常见的分布式算法,我们可以更好地理解和应用分布式系统,从而促进分布式计算的发展。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分布式系统几种典型一致性算法概述姓名:王昌志学院:电子电气工程学号:M020214105 在分布式系统中,我们经常遇到多数据副本保持一致的问题。

在这里,我们通俗地把一致性的问题可分解为2个问题:1、任何一次修改保证数据一致性。

2、多次数据修改的一致性。

在弱一致性的算法,不要求每次修改的内容在修改后多副本的内容是一致的,对问题1的解决比较宽松,更多解决问题2,该类算法追求每次修改的高度并发性,减少多副本之间修改的关联性,以获得更好的并发性能。

例如最终一致性,无所谓每次用户修改后的多副本的一致性及格过,只要求在单调的时间方向上,数据最终保持一致,如此获得了修改极大的并发性能。

在强一致性的算法中,强调单次修改后结果的一致,需要保证了对问题1和问题2要求的实现,牺牲了并发性能。

本文是讨论对解决问题1实现算法,这些算法往往在强一致性要求的应用中使用。

解决问题1的方法,通常有两阶段提交算法、采用分布式锁服务和采用乐观锁原理实现的同步方式,下面分别介绍这几种算法的实现原理。

一.两阶段提交算法在两阶段提交协议中,系统一般包含两类机器(或节点):一类为协调者(coordinator),通常一个系统中只有一个;另一类为事务参与者(participants,cohorts或workers),一般包含多个,在数据存储系统中可以理解为数据副本的个数。

两阶段提交协议由两个阶段组成,在正常的执行下,这两个阶段的执行过程如下所述:阶段1:请求阶段(commit-request phase,或称表决阶段,voting phase)。

在请求阶段,协调者将通知事务参与者准备提交或取消事务,然后进入表决过程。

在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。

阶段2:提交阶段(commit phase)。

在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。

当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务。

参与者在接收到协调者发来的消息后将执行响应的操作。

举个例子:A组织B、C和D三个人去爬长城:如果所有人都同意去爬长城,那么活动将举行;如果有一人不同意去爬长城,那么活动将取消。

用2PC算法解决该问题的过程如下:∙首先A将成为该活动的协调者,B、C和D将成为该活动的参与者。

∙阶段1:A发邮件给B、C和D,提出下周三去爬山,问是否同意。

那么此时A需要等待B、C和D的邮件。

B、C和D分别查看自己的日程安排表。

B、C发现自己在当日没有活动安排,则发邮件告诉A它们同意下周三去爬长城。

由于某种原因,D白天没有查看邮件。

那么此时A、B和C均需要等待。

到晚上的时候,D发现了A的邮件,然后查看日程安排,发现周三当天已经有别的安排,那么D回复A说活动取消吧。

∙阶段2:此时A收到了所有活动参与者的邮件,并且A发现D下周三不能去爬山。

那么A将发邮件通知B、C和D,下周三爬长城活动取消。

此时B、C回复A“太可惜了”,D回复A“不好意思”。

至此该事务终止。

两阶段提交算法在分布式系统结合,可实现单用户对文件(对象)多个副本的修改,多副本数据的同步。

其结合的原理如下:1、客户端(协调者)向所有的数据副本的存储主机(参与者)发送:修改具体的文件名、偏移量、数据和长度信息,请求修改数据,该消息是1阶段的请求消息。

2、存储主机接收到请求后,备份修改前的数据以备回滚,修改文件数据后,向客户端回应修改成功的消息。

如果存储主机由于某些原因(磁盘损坏、空间不足等)不能修改数据,回应修改失败的消息。

3、客户端接收发送出去的每一个消息回应,如果存储主机全部回应都修改成功,向每存储主机发送确认修改的提交消息;如果存在存储主机回应修改失败,或者超时未回应,客户端向所有存储主机发送取消修改的提交消息。

该消息是2阶段的提交消息。

4、存储主机接收到客户端的提交消息,如果是确认修改,则直接回应该提交OK消息;如果是取消修改,则将修改数据还原为修改前,然后回应取消修改OK的消息。

5、客户端接收全部存储主机的回应,整个操作成功。

在该过程中可能存在通信失败,例如网络中断、主机宕机等诸多的原因,对于未在算法中定义的其它异常,都认为是提交失败,都需要回滚,这是该算法基于确定的通信回复实现的,在参与者的确定回复(无论是回复失败还是回复成功)之上执行逻辑处理,符合确定性的条件当然能够获得确定性的结果哲学原理。

二.Lamport面包店算法是解决多个线程并发访问一个共享的单用户资源的互斥问题的算法。

由Leslie Lamport发明。

Lamport把这个并发控制算法可以非常直观地类比为顾客去面包店采购。

面包店只能接待一位顾客的采购。

已知有n位顾客要进入面包店采购,安排他们按照次序在前台登记一个签到号码。

该签到号码逐次加1。

根据签到号码的由小到大的顺序依次入店购货。

完成购买的顾客在前台把其签到号码归0. 如果完成购买的顾客要再次进店购买,就必须重新排队。

这个类比中的顾客就相当于线程,而入店购货就是进临界区独占访问该共享资源。

由于计算机实现的特点,存在两个线程获得相同的签到号码的情况,这是因为两个线程几乎同时申请排队的签到号码,读取已经发出去的签到号码情况,这两个线程读到的数据是完全一样的,然后各自在读到的数据上找到最大值,再加1作为自己的排队签到号码。

为此,该算法规定如果两个线程的排队签到号码相等,则线程id号较小的具有优先权。

把该算法原理与分布式系统相结合,即可实现分步锁。

三.Paxos算法Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。

一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。

为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。

一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。

节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。

Paxos算法就是一种基于消息传递模型的一致性算法。

BigTable使用一个分布式数据锁服务Chubby,而Chubby使用Paxos算法来保证备份的一致性。

我们举个例子说明该算法的实现原理。

如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用前面的分布式锁服务机制,也就意味着整个操作过程中(从操作员读出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果。

乐观锁机制在一定程度上解决了这个问题。

乐观锁,大多是基于数据版本(Version)记录机制实现。

何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。

读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。

此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

对于上面修改用户帐户信息的例子而言,假设数据库中帐户信息表中有一个version 字段,当前值为 1 ;而当前帐户余额字段(balance )为$100 。

1.操作员 A 此时将其读出(version=1 ),并从其帐户余额中扣除$50($100-$50 )。

2.在操作员A 操作的过程中,操作员B也读入此用户信息(version=1 ),并从其帐户余额中扣除$20 ($100-$20 )。

3.操作员A 完成了修改工作,将数据版本号加一(version=2 ),连同帐户扣除后余额(balance=$50 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录version 更新为 2 。

4.操作员B 完成了操作,也将版本号加一(version=2 )试图向数据库提交数据(balance=$80 ),但此时比对数据库记录版本时发现,操作员 B提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足“提交版本必须大于记录当前版本才能执行更新“的乐观锁策略,因此,操作员 B 的提交被驳回。

这样,就避免了操作员 B 用基于version=1 的旧数据修改的结果覆盖操作员A 的操作结果的可能。

乐观锁机制与分布式系统相结合上,其代码如下:obj 操作的目标vlaue 修改的值atom_update_ver 每个目标上的版本,每次修改该值递增set( obj, value){//从每个节点上取出修改前的对象版本//get original_ver = obj.atom_update_ver from each node;//将值赋到每个节点的obj目标//set obj = value from each node;//条件修改每个节点的obj版本,目标版本加一////比较和修改操作是原子操作//result = (set obj.atom_update_ver = original_ver + 1where original_ver + 1 > obj.atom_update_verfor each node);if(result == ok)return set_ok;elsereturn set(obj, value);//不成功递归修改。

相关文档
最新文档