企业级应用系统体系架构十一企业应用的处理课件.ppt

上传人(卖家):晟晟文业 文档编号:5004276 上传时间:2023-02-01 格式:PPT 页数:83 大小:413KB
下载 相关 举报
企业级应用系统体系架构十一企业应用的处理课件.ppt_第1页
第1页 / 共83页
企业级应用系统体系架构十一企业应用的处理课件.ppt_第2页
第2页 / 共83页
企业级应用系统体系架构十一企业应用的处理课件.ppt_第3页
第3页 / 共83页
企业级应用系统体系架构十一企业应用的处理课件.ppt_第4页
第4页 / 共83页
企业级应用系统体系架构十一企业应用的处理课件.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

1、企业级应用系统体系架构企业级应用系统体系架构(十一)(十一)企业应用的处理企业应用的处理Chen HaopengWednesday,February 01,20231处理处理n你必须放下两方的所有偏见,既不相信也不排斥任何你必须放下两方的所有偏见,既不相信也不排斥任何事情,因为其他任何人或者这些人的描述,都已经排事情,因为其他任何人或者这些人的描述,都已经排斥或相信它了。你自己的理由是上天给你的唯一神谕,斥或相信它了。你自己的理由是上天给你的唯一神谕,对此你负有责任,不是为了抉择的公正,而是为了抉对此你负有责任,不是为了抉择的公正,而是为了抉择的合理。择的合理。Thomas Jefferson

2、n不要去找精灵商议,因为他们既说是又说否。不要去找精灵商议,因为他们既说是又说否。Gandalf 对对 Frodo说说,指环王指环王处理处理n在处理是在企业系统中中间件不能为我们解决的那一部分,是我在处理是在企业系统中中间件不能为我们解决的那一部分,是我们应用的们应用的“血肉血肉”。它有过:。它有过:业务规则、业务逻辑、领域逻辑、业务规则、业务逻辑、领域逻辑、应用代码应用代码,等等无数多的称呼。正如它的本质所言,处理是业务,等等无数多的称呼。正如它的本质所言,处理是业务首先要关注的东西:对没有在其它任何地方处理过的数据进行处首先要关注的东西:对没有在其它任何地方处理过的数据进行处理。理。n企业

3、系统中相当大一部分都是在处理企业系统中相当大一部分都是在处理并发并发考虑到最大的吞吐考虑到最大的吞吐量,我们需要假定两件事情可以在同一时间发生。量,我们需要假定两件事情可以在同一时间发生。n在企业系统中,并发同时涉及到两个主题:在企业系统中,并发同时涉及到两个主题:编程语言自己的基于编程语言自己的基于监视器的对象同步系统监视器的对象同步系统和和构建于大多数企业资源管理器内部的基构建于大多数企业资源管理器内部的基于事务的同步机制于事务的同步机制。处理处理n第第1项:保持简洁项:保持简洁n第第2项:优先采用规则引擎去处理复杂状态的评估和执行项:优先采用规则引擎去处理复杂状态的评估和执行n第第3项:

4、优先为隐含的非原子性错误场景采用事务性处理项:优先为隐含的非原子性错误场景采用事务性处理n第第4项:区分用户事务和系统事务项:区分用户事务和系统事务n第第5项:最小化锁窗口项:最小化锁窗口n第第6项:优先使用本地事务而不是分布式事务项:优先使用本地事务而不是分布式事务n第第7项:为了更好的可扩展性而考虑使用乐观的并发机制项:为了更好的可扩展性而考虑使用乐观的并发机制n第第8项:为了显式的并发控制而考虑使用悲观的并发机制项:为了显式的并发控制而考虑使用悲观的并发机制n第第9项:考虑使用较低的隔离级别以获得更大的事务吞吐量项:考虑使用较低的隔离级别以获得更大的事务吞吐量n第第10项:面临回滚时使用

5、保存点来保留部分工作项:面临回滚时使用保存点来保留部分工作n第第11项:当有可能避免锁定区域时就复制数据源项:当有可能避免锁定区域时就复制数据源n第第12项:偏爱不可变的,因为它不需要任何锁项:偏爱不可变的,因为它不需要任何锁 保持简洁保持简洁nKISS(Keep It Simple,Stupid,保持简洁易用)。要做那些能,保持简洁易用)。要做那些能够让系统运转的最简洁的事情,这就是简洁性规则。够让系统运转的最简洁的事情,这就是简洁性规则。n复杂性的某些部分需要被应用到领域问题本身,因此如果你将全复杂性的某些部分需要被应用到领域问题本身,因此如果你将全部复杂性都花费到了复杂的技术上,以至于超

6、越费用底线,那么部复杂性都花费到了复杂的技术上,以至于超越费用底线,那么该项目将会崩溃。该项目将会崩溃。保持简洁保持简洁n如果你不能解释一个给定的由一条单一语句,或者至多两条语句如果你不能解释一个给定的由一条单一语句,或者至多两条语句构成的处理代码片段做了些什么,那么它就可能过于复杂了。构成的处理代码片段做了些什么,那么它就可能过于复杂了。n复杂解决方案存在的问题数也数不清,但是基本上都可以归咎于复杂解决方案存在的问题数也数不清,但是基本上都可以归咎于下面几个基本直接原因:下面几个基本直接原因:n复杂解决方案很难被模块化,因此难以被重用复杂解决方案很难被模块化,因此难以被重用。n复杂解决方案难

7、于调试复杂解决方案难于调试。n复杂解决方案难于被优化复杂解决方案难于被优化。n复杂解决方案更难于维护复杂解决方案更难于维护。n通常,企业级项目倾向于复杂而不是简单:复杂系统比简单系统通常,企业级项目倾向于复杂而不是简单:复杂系统比简单系统更具更具“男子气概男子气概”这种想法是不对的。无论出于什么原因,我们这种想法是不对的。无论出于什么原因,我们都应该不断地重复强调:保持简洁,让工具去完成尽可能多的工都应该不断地重复强调:保持简洁,让工具去完成尽可能多的工作。作。处理处理n第第1项:保持简洁项:保持简洁n第第2项:优先采用规则引擎去处理复杂状态的评估和执行项:优先采用规则引擎去处理复杂状态的评估

8、和执行n第第3项:优先为隐含的非原子性错误场景采用事务性处理项:优先为隐含的非原子性错误场景采用事务性处理n第第4项:区分用户事务和系统事务项:区分用户事务和系统事务n第第5项:最小化锁窗口项:最小化锁窗口n第第6项:优先使用本地事务而不是分布式事务项:优先使用本地事务而不是分布式事务n第第7项:为了更好的可扩展性而考虑使用乐观的并发机制项:为了更好的可扩展性而考虑使用乐观的并发机制n第第8项:为了显式的并发控制而考虑使用悲观的并发机制项:为了显式的并发控制而考虑使用悲观的并发机制n第第9项:考虑使用较低的隔离级别以获得更大的事务吞吐量项:考虑使用较低的隔离级别以获得更大的事务吞吐量n第第10

9、项:面临回滚时使用保存点来保留部分工作项:面临回滚时使用保存点来保留部分工作n第第11项:当有可能避免锁定区域时就复制数据源项:当有可能避免锁定区域时就复制数据源n第第12项:偏爱不可变的,因为它不需要任何锁项:偏爱不可变的,因为它不需要任何锁 优先采用规则引擎去优先采用规则引擎去处理复杂状态的评估和执行处理复杂状态的评估和执行n请考虑一下,如果为你桌子上的计算机定购请考虑一下,如果为你桌子上的计算机定购DVD,那么我们需要,那么我们需要确保他们得到的不是确保他们得到的不是KorSplatt 5900显卡,因为这种显卡不能和显卡,因为这种显卡不能和此此DVD模型一起工作,当然除非想更换为模型一

10、起工作,当然除非想更换为CD-RW/DVD。噢,。噢,KorSplatt 5900不能在一台少于不能在一台少于512MB RAM的机器上运转,除的机器上运转,除非它是非它是SuperReallyFastRAM。n由于所有可能的由于所有可能的“公司希望在基本不兼容的限制之上仍然能够运公司希望在基本不兼容的限制之上仍然能够运行行”的促销策略的因素,再加上所有这些东西一个月(如果不是的促销策略的因素,再加上所有这些东西一个月(如果不是一个星期的话!)就会变动一次,以及突然冒出来的要试图为在一个星期的话!)就会变动一次,以及突然冒出来的要试图为在线线PC生产商创建生产商创建“计算机配置器计算机配置器”

11、的想法,都使得大多数坚毅的的想法,都使得大多数坚毅的IT行家望而却步。行家望而却步。优先采用规则引擎去优先采用规则引擎去处理复杂状态的评估和执行处理复杂状态的评估和执行n这里的问题是这种复杂性评估很难用这里的问题是这种复杂性评估很难用Java这种命令式语言去执行,这种这种命令式语言去执行,这种语言关注的是语言关注的是CPU一步一步的实现。从本质上说,我们告诉机器的是怎一步一步的实现。从本质上说,我们告诉机器的是怎样做这项工作,因此这意味着我们必须对各种需要被评估的条件以及这样做这项工作,因此这意味着我们必须对各种需要被评估的条件以及这些条件需要被考虑的顺序非常明了。这会导致产生像下面这样复杂和

12、难些条件需要被考虑的顺序非常明了。这会导致产生像下面这样复杂和难以维护的代码:以维护的代码:if(currentPC.drives().contains(DVD)if(currentPC.videoCard().equals(KorSplatt 5900)&!(currentPC.drives().get(DVD).equals(CD-RW/DVD)warn(DVD incompatible with KorSplatt 5900);else if(currentPC.videoCard().equals(KorSplatt 5900)¤tPC.memory()512)/.优先采用

13、规则引擎去优先采用规则引擎去处理复杂状态的评估和执行处理复杂状态的评估和执行n这种类型的处理是一种特殊的编程模式,称作基于规则的程序设这种类型的处理是一种特殊的编程模式,称作基于规则的程序设计,并且幸运的是我们能够得到这些计,并且幸运的是我们能够得到这些规则引擎规则引擎,这种软件可以检,这种软件可以检验数据集,查看在引擎中声明的规则列表,然后推断应该引发那验数据集,查看在引擎中声明的规则列表,然后推断应该引发那条规则以响应数据的当前状态。条规则以响应数据的当前状态。n更重要的是,规则引擎接着可以在必要时重新应用这些规则到发更重要的是,规则引擎接着可以在必要时重新应用这些规则到发生了变更的数据上

14、,直到数据到达一种生了变更的数据上,直到数据到达一种稳定状态稳定状态不再触发更多的不再触发更多的规则为止。规则为止。优先采用规则引擎去优先采用规则引擎去处理复杂状态的评估和执行处理复杂状态的评估和执行n规则引擎通常服务于两个目的:规则引擎通常服务于两个目的:n(1)以最好的方式捕获业务规则)以最好的方式捕获业务规则n(2)允许修改这些规则而不需要重新编码)允许修改这些规则而不需要重新编码Java代码本身。代码本身。n第一个目的通常是最大的收获,因为在一大堆的第一个目的通常是最大的收获,因为在一大堆的if/then/else语句语句中去尽力追踪业务规则不仅难于实现而且易于发生错误。中去尽力追踪业

15、务规则不仅难于实现而且易于发生错误。n然而,如果你的用户足够老练,那么教会他们规则引擎能够理解然而,如果你的用户足够老练,那么教会他们规则引擎能够理解的的“规则语言规则语言”还会有一个附加的好处,即还会有一个附加的好处,即给予了他们修改应用给予了他们修改应用的业务逻辑的核心部分的能力的业务逻辑的核心部分的能力,从而有效地将程序员从业务逻辑,从而有效地将程序员从业务逻辑改变的循环中跳出,因为业务逻辑的改变可能需要另外一个完整改变的循环中跳出,因为业务逻辑的改变可能需要另外一个完整的开发周期(开发、测试、的开发周期(开发、测试、QA、发布、配置等等)。、发布、配置等等)。优先采用规则引擎去优先采用

16、规则引擎去处理复杂状态的评估和执行处理复杂状态的评估和执行RuleServiceProvider provider=/./Either use a JNDI lookup,or else use /RuleServiceProviderManager,similar in concept /to the JDBC DriverManagerRuleAdministrator admin=provider.getRuleAdministrator();RuleExecutionSet ruleSet=null;/Load the rules from a local file using/Loc

17、alRuleExecutionSetProviderFileReader reader=new FileReader(rules.xml);try HashMap props=new HashMap();props.put(name,Configuration Rules);props.put(description,Rulebase for company PC configuration);LocalRuleExecutionSetProvider lresp=admin.getLocalRuleExecutionSetProvider(props);ruleSet=lresp.creat

18、eRuleExecutionSet(reader,props);Finally reader.close();admin.registerRuleExecutionSet(rules,ruleSet,props);优先采用规则引擎去优先采用规则引擎去处理复杂状态的评估和执行处理复杂状态的评估和执行nrules.xml文件正如它的名字所暗示的那样,包含一些用面向文件正如它的名字所暗示的那样,包含一些用面向XML的格式表示的规则。的格式表示的规则。n一旦引擎的初始化完成,在运行时使用它就显得相当简单直接了。一旦引擎的初始化完成,在运行时使用它就显得相当简单直接了。JSR-94定义了两种定义了两种R

19、uleSession类型,有状态的和无状态的,大类型,有状态的和无状态的,大致与致与EJB的会话的会话Bean的有状态和无状态的差异相对应:有状态的的有状态和无状态的差异相对应:有状态的RuleSession在多个调用之间保留有它自己的工作内存,而无状在多个调用之间保留有它自己的工作内存,而无状态的态的RuleSession则没有。这意味着在无状态的则没有。这意味着在无状态的RuleSession中,中,那些(为了评估规则)被添加到工作内存的对象,在规则被评估那些(为了评估规则)被添加到工作内存的对象,在规则被评估之后,即消失了。之后,即消失了。优先采用规则引擎去优先采用规则引擎去处理复杂状态

20、的评估和执行处理复杂状态的评估和执行/Create the RuleSession instanceRuleRuntime runtime=rep.getRuleRuntime();StatefulRuleSession srs=(StatefulRuleSession)runtime.createRuleSession(rules,props,RuleRuntime.STATEFUL_SESSION_TYPE);/Populate the RuleSessions working memory with the data/to evaluate againstsrs.addObject(ne

21、w Integer(12);srs.addObject(Hello,world);srs.addObject(new CustomDataObject();/Execute the rulessrs.executeRules();/Examine the entire contents of the working/memoryobjects may have been modified by/executing rulesList results=srs.getObjects();/Release the RuleSessionsrs.release();优先采用规则引擎去优先采用规则引擎去

22、处理复杂状态的评估和执行处理复杂状态的评估和执行n与与SQL和和 XSLT很相似,大多数规则语言本质上是命令式的,意思是你很相似,大多数规则语言本质上是命令式的,意思是你不必像指定不必像指定什么时间去做什么时间去做和和应该做什么应该做什么那样指出那样指出怎样去做怎样去做也就是,也就是,你指定某种谓词条件,去说明触发的规则和在规则触发时应采取的动作。你指定某种谓词条件,去说明触发的规则和在规则触发时应采取的动作。例如,在构成完备的类似例如,在构成完备的类似XML的规则语言中,一条用于的规则语言中,一条用于PC配置器的规则配置器的规则可能像这里展示的代码那样,在这里,条件元素是某种类似可能像这里展

23、示的代码那样,在这里,条件元素是某种类似XPath的查的查询语法,行为元素像某种脚本语言。询语法,行为元素像某种脚本语言。(drivestype=DVD and type!=CD-RW/DVD 1)and (videomfr=KorSplatt and videoversion=5900)put(KorSplatt 5900 is incompatible with regular DVD)处理处理n第第1项:保持简洁项:保持简洁n第第2项:优先采用规则引擎去处理复杂状态的评估和执行项:优先采用规则引擎去处理复杂状态的评估和执行n第第3项:优先为隐含的非原子性错误场景采用事务性处理项:优先为隐

24、含的非原子性错误场景采用事务性处理n第第4项:区分用户事务和系统事务项:区分用户事务和系统事务n第第5项:最小化锁窗口项:最小化锁窗口n第第6项:优先使用本地事务而不是分布式事务项:优先使用本地事务而不是分布式事务n第第7项:为了更好的可扩展性而考虑使用乐观的并发机制项:为了更好的可扩展性而考虑使用乐观的并发机制n第第8项:为了显式的并发控制而考虑使用悲观的并发机制项:为了显式的并发控制而考虑使用悲观的并发机制n第第9项:考虑使用较低的隔离级别以获得更大的事务吞吐量项:考虑使用较低的隔离级别以获得更大的事务吞吐量n第第10项:面临回滚时使用保存点来保留部分工作项:面临回滚时使用保存点来保留部分

25、工作n第第11项:当有可能避免锁定区域时就复制数据源项:当有可能避免锁定区域时就复制数据源n第第12项:偏爱不可变的,因为它不需要任何锁项:偏爱不可变的,因为它不需要任何锁 优先为隐含的非原子性优先为隐含的非原子性错误场景采用事务性处理错误场景采用事务性处理n作为一个程序员,我们习惯于那种使用隐含地是原子性的语言去作为一个程序员,我们习惯于那种使用隐含地是原子性的语言去实现各种操作的模式:也就是说,被调用的函数要么返回正确的实现各种操作的模式:也就是说,被调用的函数要么返回正确的值,要么返回某种错误代码或异常。值,要么返回某种错误代码或异常。n遗憾的是,这种原子性操作完全是一种假象。在我们编程

26、的高层遗憾的是,这种原子性操作完全是一种假象。在我们编程的高层几乎没有任何事物是真正原子性的。几乎没有任何事物是真正原子性的。n例如,当我们调用例如,当我们调用Math.sqrt方法时,我们所用的执行线程依次方法时,我们所用的执行线程依次开始执行在开始执行在Math.sqrt定义内的代码,将这些代码再依次分解成定义内的代码,将这些代码再依次分解成单独的单独的CPU指令,在指令,在CPU上依次连续地执行这些指令,而上依次连续地执行这些指令,而CPU肯肯定周期性地请求总线从定周期性地请求总线从RAM获取某些额外的数据,等等。获取某些额外的数据,等等。n很多工作是很多工作是“在遮盖下在遮盖下”完成的

27、以呈现出这种视觉上的原子性完成的以呈现出这种视觉上的原子性实际上,就是这语言和实际上,就是这语言和/或编译器的大部分工作,极大地掩盖这或编译器的大部分工作,极大地掩盖这种复杂性,因此就不会种复杂性,因此就不会“妨碍妨碍”到我们真正想做的,在这里就是到我们真正想做的,在这里就是计算出平方根。计算出平方根。优先为隐含的非原子性优先为隐含的非原子性错误场景采用事务性处理错误场景采用事务性处理n从编程人员的角度来看,事务的基本模型很简单:你依据资源管从编程人员的角度来看,事务的基本模型很简单:你依据资源管理器创建一个事务,其中资源管理器就是你想进行处理的事物。理器创建一个事务,其中资源管理器就是你想进

28、行处理的事物。n事务性资源管理器当然就是关系型数据库,但是其它资源管理器事务性资源管理器当然就是关系型数据库,但是其它资源管理器当然也是有可能的,包括但不仅限于当然也是有可能的,包括但不仅限于JMS消息代理、遗留的大型消息代理、遗留的大型机系统或其它用机系统或其它用Connector访问的系统,甚至可能是底层的文件访问的系统,甚至可能是底层的文件系统,如果文件系统支持的话。系统,如果文件系统支持的话。处理处理n第第1项:保持简洁项:保持简洁n第第2项:优先采用规则引擎去处理复杂状态的评估和执行项:优先采用规则引擎去处理复杂状态的评估和执行n第第3项:优先为隐含的非原子性错误场景采用事务性处理项

29、:优先为隐含的非原子性错误场景采用事务性处理n第第4项:区分用户事务和系统事务项:区分用户事务和系统事务n第第5项:最小化锁窗口项:最小化锁窗口n第第6项:优先使用本地事务而不是分布式事务项:优先使用本地事务而不是分布式事务n第第7项:为了更好的可扩展性而考虑使用乐观的并发机制项:为了更好的可扩展性而考虑使用乐观的并发机制n第第8项:为了显式的并发控制而考虑使用悲观的并发机制项:为了显式的并发控制而考虑使用悲观的并发机制n第第9项:考虑使用较低的隔离级别以获得更大的事务吞吐量项:考虑使用较低的隔离级别以获得更大的事务吞吐量n第第10项:面临回滚时使用保存点来保留部分工作项:面临回滚时使用保存点

30、来保留部分工作n第第11项:当有可能避免锁定区域时就复制数据源项:当有可能避免锁定区域时就复制数据源n第第12项:偏爱不可变的,因为它不需要任何锁项:偏爱不可变的,因为它不需要任何锁 区分用户事务和系统事务区分用户事务和系统事务n一个用户正在使用在线银行系统。她只是想进行简单的余额过户,一个用户正在使用在线银行系统。她只是想进行简单的余额过户,从她的现金账号过户到她的支票账户(可能包括她今天稍早时候从她的现金账号过户到她的支票账户(可能包括她今天稍早时候签过的大额支票)。她选择菜单中余额过户(签过的大额支票)。她选择菜单中余额过户(Balance Transfer)选项,从显示的账户列表中选择

31、她的支票账户,输入她想过户的选项,从显示的账户列表中选择她的支票账户,输入她想过户的钱数,从显示的第二个账户列表中选择她的现金账户,然后点击钱数,从显示的第二个账户列表中选择她的现金账户,然后点击执行(执行(Go)。)。n这里到底用到了多少个事务呢?问题并不像看起来的那样简单。这里到底用到了多少个事务呢?问题并不像看起来的那样简单。对于用户以及任何一个会计学的学生来说,这似乎好像是只有一对于用户以及任何一个会计学的学生来说,这似乎好像是只有一个事务,但是对于系统来说,可能是有两个数据库的事务,尤其个事务,但是对于系统来说,可能是有两个数据库的事务,尤其是如果我们正在和多个数据库或其它资源通信是

32、如果我们正在和多个数据库或其它资源通信处理处理n第第1项:保持简洁项:保持简洁n第第2项:优先采用规则引擎去处理复杂状态的评估和执行项:优先采用规则引擎去处理复杂状态的评估和执行n第第3项:优先为隐含的非原子性错误场景采用事务性处理项:优先为隐含的非原子性错误场景采用事务性处理n第第4项:区分用户事务和系统事务项:区分用户事务和系统事务n第第5项:最小化锁窗口项:最小化锁窗口n第第6项:优先使用本地事务而不是分布式事务项:优先使用本地事务而不是分布式事务n第第7项:为了更好的可扩展性而考虑使用乐观的并发机制项:为了更好的可扩展性而考虑使用乐观的并发机制n第第8项:为了显式的并发控制而考虑使用悲

33、观的并发机制项:为了显式的并发控制而考虑使用悲观的并发机制n第第9项:考虑使用较低的隔离级别以获得更大的事务吞吐量项:考虑使用较低的隔离级别以获得更大的事务吞吐量n第第10项:面临回滚时使用保存点来保留部分工作项:面临回滚时使用保存点来保留部分工作n第第11项:当有可能避免锁定区域时就复制数据源项:当有可能避免锁定区域时就复制数据源n第第12项:偏爱不可变的,因为它不需要任何锁项:偏爱不可变的,因为它不需要任何锁 最小化锁窗口最小化锁窗口n“作为一条规则,在被同步的区域内,你应该执行尽可能少的操作为一条规则,在被同步的区域内,你应该执行尽可能少的操作作。”对于企业级系统,这个规则也有效,在企业

34、级系统中,共对于企业级系统,这个规则也有效,在企业级系统中,共享资源中的锁将引发竞争,从而限制了系统最终的可扩展性。享资源中的锁将引发竞争,从而限制了系统最终的可扩展性。n考虑这个繁琐的例子,其中一个线程调用一个非同步方法三千五考虑这个繁琐的例子,其中一个线程调用一个非同步方法三千五百万次,在这之后调用另一个等同的同步方法三千五百万次,然百万次,在这之后调用另一个等同的同步方法三千五百万次,然后比较作为结果的计时时间。后比较作为结果的计时时间。n我们打算为这个有点琐碎的代码写出三个不同的版本我们打算为这个有点琐碎的代码写出三个不同的版本n一个完全不使用任何同步一个完全不使用任何同步n一个在方法

35、调用本身上使用一个被同步的修改器一个在方法调用本身上使用一个被同步的修改器n另一个使用粒度更粗的被同步的方法。另一个使用粒度更粗的被同步的方法。n执行分成两部分执行分成两部分n第一部分将从一个单一线程中执行一个方法三千五百万次第一部分将从一个单一线程中执行一个方法三千五百万次n然后我们新增加一个没有任何其它影响的由命令行传入的线然后我们新增加一个没有任何其它影响的由命令行传入的线程数,并让这些线程每一个都执行三千五百万次。程数,并让这些线程每一个都执行三千五百万次。最小化锁窗口最小化锁窗口n首先,我们可以很清楚地看到非同步版本是最快的。首先,我们可以很清楚地看到非同步版本是最快的。n第二,我们

36、还可以很清楚地看到粗粒度的同步版本比细粒度的同步版本第二,我们还可以很清楚地看到粗粒度的同步版本比细粒度的同步版本花费时间要少很多,不过对于细粒度同步版本,有一件奇怪的事情:执花费时间要少很多,不过对于细粒度同步版本,有一件奇怪的事情:执行花费的时间好像与线程结束的时间成线性比例。实际上,这正是很精行花费的时间好像与线程结束的时间成线性比例。实际上,这正是很精确地对应于所发生的事情确地对应于所发生的事情第一个调度线程抢占锁,并在整个三千五第一个调度线程抢占锁,并在整个三千五百次迭代循环中持有该锁,期间从没有放弃过该锁,因此其它的线程必百次迭代循环中持有该锁,期间从没有放弃过该锁,因此其它的线程

37、必须等待直到释放锁,才能去为得到它而竞争。到最后一个线程获得锁的须等待直到释放锁,才能去为得到它而竞争。到最后一个线程获得锁的时候,这个线程已经等待了一段时间。时候,这个线程已经等待了一段时间。n第三,在细粒度的机制中,在每次调用上都会获得和释放监视器,因此第三,在细粒度的机制中,在每次调用上都会获得和释放监视器,因此产生了最平均的数字,不过也最差。产生了最平均的数字,不过也最差。n简而言之,竞争是可扩展性的敌人。系统中存在越多的竞争,我们就需简而言之,竞争是可扩展性的敌人。系统中存在越多的竞争,我们就需要等待越长的时间,反过来又会加重系统的整体的响应延迟。我们不能要等待越长的时间,反过来又会

38、加重系统的整体的响应延迟。我们不能扩展一个存在竞争问题的系统。扩展一个存在竞争问题的系统。最小化锁窗口最小化锁窗口n紧记两点。首先,当你有别的办法时,就请避免使用锁紧记两点。首先,当你有别的办法时,就请避免使用锁即使即使没有任何其他人最终和你竞争锁,但它仍要把花费宝贵的时间花没有任何其他人最终和你竞争锁,但它仍要把花费宝贵的时间花在只是获得监视器和将它释放上。在只是获得监视器和将它释放上。n第二,尽可能地减少花费在同步区域内的时间第二,尽可能地减少花费在同步区域内的时间处理处理n第第1项:保持简洁项:保持简洁n第第2项:优先采用规则引擎去处理复杂状态的评估和执行项:优先采用规则引擎去处理复杂状

39、态的评估和执行n第第3项:优先为隐含的非原子性错误场景采用事务性处理项:优先为隐含的非原子性错误场景采用事务性处理n第第4项:区分用户事务和系统事务项:区分用户事务和系统事务n第第5项:最小化锁窗口项:最小化锁窗口n第第6项:优先使用本地事务而不是分布式事务项:优先使用本地事务而不是分布式事务n第第7项:为了更好的可扩展性而考虑使用乐观的并发机制项:为了更好的可扩展性而考虑使用乐观的并发机制n第第8项:为了显式的并发控制而考虑使用悲观的并发机制项:为了显式的并发控制而考虑使用悲观的并发机制n第第9项:考虑使用较低的隔离级别以获得更大的事务吞吐量项:考虑使用较低的隔离级别以获得更大的事务吞吐量n

40、第第10项:面临回滚时使用保存点来保留部分工作项:面临回滚时使用保存点来保留部分工作n第第11项:当有可能避免锁定区域时就复制数据源项:当有可能避免锁定区域时就复制数据源n第第12项:偏爱不可变的,因为它不需要任何锁项:偏爱不可变的,因为它不需要任何锁 优先使用本地事务优先使用本地事务而不是分布式事务而不是分布式事务 n如果我们有两个需要作为某个单一处理的一部分而被操作的资源,那么如果我们有两个需要作为某个单一处理的一部分而被操作的资源,那么会发生什么呢?会发生什么呢?n大量的数据库开发商聚集到一起定义了分布式事务协议,称作两阶段提大量的数据库开发商聚集到一起定义了分布式事务协议,称作两阶段提

41、交协议(交协议(TPC,two-phase commit protocol)。在)。在TPC中,我们正式地中,我们正式地定义了作为每个事务的一部分的三个参与方:客户端;资源管理器定义了作为每个事务的一部分的三个参与方:客户端;资源管理器(RM,Resource Manager),它提供了我们试图共享访问的共享资源;),它提供了我们试图共享访问的共享资源;和事务管理器(和事务管理器(TM,Transaction Manager),它被用来创建分布式事),它被用来创建分布式事务并处理客户和务并处理客户和RM之间的交互。之间的交互。n不过,没有免费的午餐,不过,没有免费的午餐,TPC也有它自身的开销

42、。也有它自身的开销。优先使用本地事务优先使用本地事务而不是分布式事务而不是分布式事务 n除非你绝对必须使用分布式事务,否则你就应该避免使用它,因除非你绝对必须使用分布式事务,否则你就应该避免使用它,因为分布式事务意味着你必须在多个资源上(数据库、为分布式事务意味着你必须在多个资源上(数据库、JMS提供者、提供者、JCA的的Connector提供者等等)具有提供者等等)具有ACID属性。属性。n如果你想使你的事务窗口尽可能的短,由于如果你想使你的事务窗口尽可能的短,由于TPC协议增加的通信协议增加的通信需求,你将会在所有可能的地方使用本地事务。需求,你将会在所有可能的地方使用本地事务。处理处理n

43、第第1项:保持简洁项:保持简洁n第第2项:优先采用规则引擎去处理复杂状态的评估和执行项:优先采用规则引擎去处理复杂状态的评估和执行n第第3项:优先为隐含的非原子性错误场景采用事务性处理项:优先为隐含的非原子性错误场景采用事务性处理n第第4项:区分用户事务和系统事务项:区分用户事务和系统事务n第第5项:最小化锁窗口项:最小化锁窗口n第第6项:优先使用本地事务而不是分布式事务项:优先使用本地事务而不是分布式事务n第第7项:为了更好的可扩展性而考虑使用乐观的并发机制项:为了更好的可扩展性而考虑使用乐观的并发机制n第第8项:为了显式的并发控制而考虑使用悲观的并发机制项:为了显式的并发控制而考虑使用悲观

44、的并发机制n第第9项:考虑使用较低的隔离级别以获得更大的事务吞吐量项:考虑使用较低的隔离级别以获得更大的事务吞吐量n第第10项:面临回滚时使用保存点来保留部分工作项:面临回滚时使用保存点来保留部分工作n第第11项:当有可能避免锁定区域时就复制数据源项:当有可能避免锁定区域时就复制数据源n第第12项:偏爱不可变的,因为它不需要任何锁项:偏爱不可变的,因为它不需要任何锁 为了更好的可扩展性而考虑使为了更好的可扩展性而考虑使用乐观的并发机制用乐观的并发机制n乐观的并发模型,也称作乐观离线锁(乐观的并发模型,也称作乐观离线锁(Optimistic Offline Lock)或者乐观锁(或者乐观锁(Op

45、timistic Lock),提供了一种方法,可以兼顾),提供了一种方法,可以兼顾两方,并双收其利两方,并双收其利给你增加了一小部分的额外工作,同时你给你增加了一小部分的额外工作,同时你还可以将实际取出的锁的数量保持到最小。还可以将实际取出的锁的数量保持到最小。n实际上乐观并发可以按照不同的形式实现;版本号(实际上乐观并发可以按照不同的形式实现;版本号(Version Number)就是这样的一种方法)就是这样的一种方法n在这种方法中,每个表包含一个增添的版本号列;其它方法在这种方法中,每个表包含一个增添的版本号列;其它方法喜欢使用最新修改的时间戳。使用版本号会给你一个提示,喜欢使用最新修改的

46、时间戳。使用版本号会给你一个提示,以告诉你自从你上次查看这个数据开始,它已经被修改了多以告诉你自从你上次查看这个数据开始,它已经被修改了多少次(如果你持有的是版本少次(如果你持有的是版本1,而当前版本是,而当前版本是20,说明这个数,说明这个数据已经被修改过多次,那么你可能会选择将它丢弃然后重新据已经被修改过多次,那么你可能会选择将它丢弃然后重新开始),它不是以简单的时间戳方式来呈现的。另一方面,开始),它不是以简单的时间戳方式来呈现的。另一方面,时间戳方法可以让你在方法执行过程中获得数据库的临时要时间戳方法可以让你在方法执行过程中获得数据库的临时要素,这对于审计来说极为有用。素,这对于审计来

47、说极为有用。为了更好的可扩展性而考虑为了更好的可扩展性而考虑使用乐观的并发机制使用乐观的并发机制n在表中存在的问题是应该怎样处理数据,这些数据现在已经不能够和在在表中存在的问题是应该怎样处理数据,这些数据现在已经不能够和在数据库中存储的数据保持同步了。数据库中存储的数据保持同步了。n放弃放弃:直接将修改丢弃,用最近被修改过的数据再重新开始。在某些情形下,:直接将修改丢弃,用最近被修改过的数据再重新开始。在某些情形下,这是最好的方法,尤其是对于修改幅度很大,或者如果使用者不是真的有能这是最好的方法,尤其是对于修改幅度很大,或者如果使用者不是真的有能力去决定哪些值应该被合并的情况更是如此。它不要求

48、你必须要告诉用户你力去决定哪些值应该被合并的情况更是如此。它不要求你必须要告诉用户你做了什么,不过做了什么,不过放弃而不告知用户是相当不友好的做法。放弃而不告知用户是相当不友好的做法。n覆盖覆盖:有时最好的方法就是让最后的更新胜出。不过如果是这种情形,那么,:有时最好的方法就是让最后的更新胜出。不过如果是这种情形,那么,首先就真的没有进行乐观加锁的必要了首先就真的没有进行乐观加锁的必要了盲目的盲目的UPDATE也能很好地运转。也能很好地运转。n合并合并:获得该用户的数据,与原来的数据进行比较,然后合并所做的修改。:获得该用户的数据,与原来的数据进行比较,然后合并所做的修改。不过,这是一种充满技

49、巧的方法,因为你要艰难地决定应该怎样进行合并。不过,这是一种充满技巧的方法,因为你要艰难地决定应该怎样进行合并。为了知道你的用户修改了哪些列,你怎么才能知道源数据集中哪些数据被修为了知道你的用户修改了哪些列,你怎么才能知道源数据集中哪些数据被修改过,万一用户数据和当前数据与源数据都不一致,那么哪一个该获胜?在改过,万一用户数据和当前数据与源数据都不一致,那么哪一个该获胜?在某些情形中,最好的方法就是向用户询问部分或所有的合并。某些情形中,最好的方法就是向用户询问部分或所有的合并。n询问询问:这是与用户交谈的确定对话,:这是与用户交谈的确定对话,“数据已经被改变了,你想放弃、覆盖数据已经被改变了

50、,你想放弃、覆盖还是合并?还是合并?”正如已经描述过的那样,合并最多只能算是一种艰难的指望,正如已经描述过的那样,合并最多只能算是一种艰难的指望,因此通常因此通常“询问询问”方法直接寻求用当前的新数据重载该数据,并让用户再次方法直接寻求用当前的新数据重载该数据,并让用户再次去编辑那些需要改变的数据,这是一种混杂的放弃去编辑那些需要改变的数据,这是一种混杂的放弃/询问方法。询问方法。为了更好的可扩展性而考虑为了更好的可扩展性而考虑使用乐观的并发机制使用乐观的并发机制n乐观并发提供了一系列好处,首要好处是:乐观并发提供了一系列好处,首要好处是:在修改先前读取的数据期间,在修改先前读取的数据期间,不

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(企业级应用系统体系架构十一企业应用的处理课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|