首页 > 代码库 > 名词记忆

名词记忆

CAP理论,CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。


Consistency(一致性), 数据一致更新,所有数据变动都是同步的
Availability(可用性), 好的响应性能
Partition tolerance(分区容错性) 可靠性

技术分享


定理:任何分布式系统只可同时满足二点,没法三者兼顾。
忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。

关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区:
Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。
Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。
Isolation隔离层. 事务将假定只有它自己在操作数据库,彼此不知晓。
Durability. 一旦事务完成,就不能返回。
跨数据库事务:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的,JavaEE中的JTA事务可以支持2PC。因为2PC是反模式,尽量不要使用2PC,使用BASE来回避。

BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性:
Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库)
Soft state软状态 状态可以有一段时间不同步,异步。
Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时高一致。

BASE思想的主要实现有
1.按功能划分数据库
2.sharding碎片 

BASE思想主要强调基本的可用性,如果你需要High 可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。

现在NOSQL运动丰富了拓展了BASE思想,可按照具体情况定制特别方案,比如忽视一致性,获得高可用性等等,NOSQL应该有下面两个流派:1. Key-Value存储,如Amaze Dynamo等,可根据CAP三原则灵活选择不同倾向的数据库产品。2. 领域模型 + 分布式缓存 + 存储 (Qi4j和NoSql运动),可根据CAP三原则结合自己项目定制灵活的分布式方案,难度高。
这两者共同点:都是关系数据库SQL以外的可选方案,逻辑随着数据分布,任何模型都可以自己持久化,将数据处理和数据存储分离,将读和写分离,存储可以是异步或同步,取决于对一致性的要求程度。不同点:NOSQL之类的Key-Value存储产品是和关系数据库头碰头的产品BOX,可以适合非Java如PHP RUBY等领域,是一种可以拿来就用的产品,而领域模型 + 分布式缓存 + 存储是一种复杂的架构解决方案,不是产品,但这种方式更灵活,更应该是架构师必须掌握的。

 

1、RMI

    使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方便调用远程对象,java提供了RMI的API。在 RMI 中,远程对象按照好象它是本地行事,客户机应用程序会直接调用远程对象存根上的方法,因此,调用起来就如本地对象一样方便。RMI中封装了对象和请求的网 络传送,使得异地的对象服务直接可用。

但RMI的使用必须是在能够识别java代码的环境下使用,即必须有JVM的支持。因此,他只适合在java程序间的对象通信。如果不在 Java 环境下工作,或者需要与非 Java 环境通信,那么SOAP、RPC、CORAR等都是可以的。.

2、RPC & XML-RPC

       RPC(Remote Method Invocation,远端过程调用) 与RMI的区别很明显,相比于RMI直接获取远端方法的签名,进行调用的方式,RPC使用的是C/S方式,发送请求到服务器,等待服务器返回结果。

为了包装RPC的请求信息,推出了XML-RPC,客户端发送一条特定消息,该消息中必须包括名称、运行服务的程序以及输入参数。

XML-RPC只能使用有限的数据类型种类和一些简单的数据结构。SOAP最主要的工作是使用标准的XML描述了RPC的请求信息(URI/类/方法/参数/返回值)。SOAP的方式,SOAP 是对如CORBA 和 RMI-IIOP 这样的重型 范例吸引人的替代。

3、SOAP

       SOAP的消息被称为一个SOAP Envelope,包括SOAP Header和SOAP Body。其中,SOAP Header可以方便的插入各种其它消息来扩充Web Service的功能,比如Security(采用证书访问Web Service),SOAP Body则是具体的消息正文,也就是Marshall后的信息。

       某些程序员每天挣扎于 Perl 和 C 组件、C 和 Java 组件之间的通信。这些开发人员可以从转向基于 SOAP 或基于 XML-RPC 的通信模型中获益匪浅。另一方面,从不转向 Java 以外语言的 Java 开发人员可以转向 RMI 而不是使用 SOAP,他们会看到极大的性能改善。

4、WSDL

WSDL(Web Services Description Language)是描述web服务的,是描述怎样访问web服务的。WSDL是用来描述SOAP的,换句话说,WSDL 文件告诉你调用 SOAP 所需要知道的一切。WSDL也是一段xml。现在各个语言对wsdl的支持都很成熟,可以根据同一份wsdl文件生成自己语言的客户端。

5、REST

需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。REST即表述性状态传递(英文:Representational State Transfer,简称REST)

 

 

RUP(Rational Unified Process),统一软件开发过程,统一软件过程)是一个面向对象且基于网络的程序开发方法论。
瑞理统一过程(RUP)是Rational软件公司(Rational公司被IBM并购)创造的软件工程方法[1]  。RUP描述了如何有效地利用商业的可靠的方法开发和部署软件,是一种重量级过程(也被称作厚方法学),因此特别适用于大型软件团队开发大型项目。
 
RUP最重要的它有三大特点:1)软件开发是一个迭代过程,2)软件开发是由Use Case驱动的,3)软件开发是以架构设计(Architectural Design)为中心的。
 
CMMI全称是Capability Maturity Model Integration,即能力成熟度模型集成(也有称为:软件能力成熟度集成模型)[1]  ,是美国国防部的一个设想,1994年由美国国防部(United States Department of Defense)与卡内基-梅隆大学(Carnegie-Mellon University)下的软件工程研究中心(Software Engineering Institute,SEISM)以及美国国防工业协会(National Defense Industrial Association)共同开发和研制的,他们计划把现在所有现存实施的与即将被发展出来的各种能力成熟度模型,集成到一个框架中去,申请此认证的前提条件是该企业具有有效的软件企业认定证书。
其目的是帮助软件企业对软件工程过程进行管理和改进,增强开发与改进能力,从而能按时地、不超预算地开发出高质量的软件。其所依据的想法是:只要集中精力持续努力去建立有效的软件工程过程的基础结构,不断进行管理的实践和过程的改进,就可以克服软件开发中的困难。CMMI为改进一个组织的各种过程提供了一个单一的集成化框架,新的集成模型框架消除了各个模型的不一致性,减少了模型间的重复,增加透明度和理解,建立了一个自动的、可扩展的框架。因而能够从总体上改进组织的质量和效率。CMMI主要关注点就是成本效益、明确重点、过程集中和灵活性四个方面。
 

实施流程

阶段1:CMMI项目启动会
明确企业实施CMMI的商业目标,建立CMMI项目实施的沟通机制。
阶段2:CMMI基础培训和过程改进小组(EPG)组建
进行CMMI基础概念讲解,指导企业建立核心的过程改进小组。
阶段3:诊断
充分了解企业研发过程现状,识别企业现有软件过程与企业现阶段理应达到的CMMI成熟度级别的差距,提交诊断报告,进行过程改进的策划。
阶段4:过程域培训和文件定义
结合企业过程现状进行CMMI过程域培训,通过举例、案例分析等方式,让企业的EPG掌握过程文件定义技巧,结合企业实际情况有针对性的定义组织的研发过程,并确定过程产出物(如:需求报告)
阶段5:项目试点
选择代表公司核心业务的项目或者典型项目进行试点,通过试点来完善过程文件,从而为企业全面推广过程文件打下基础。
阶段6:组织推广
全员参与全面导入与执行CMMI。
阶段7:预评估
验证组织推广的结果,识别企业尚存缺陷并制定再次改善方案,准备充分,以便企业能够更好进行正式SCAMPI评估。
阶段8:SCAMPI A 正式评估
由SEI授权的主任评估师领导,采用SCAMPI ( Standard CMMI Appraisal Method for Process Improvement)评估方法,对企业的能力成熟度进行正式的评估,颁发证书,通过SEI网站向全球发布企业信息。
CMMI主要内容及各过程域的相互关系
CMMI 2、3级共有18个过程域(PA),主要内容如下,分四大类:
  一、过程管理:
  1. OPD:组织级过程定义。
  2. OPF:组织级过程焦点。
  3. OT:组织培训管理。
  二、项目管理:
  4. PP:项目计划。
  5. PMC:项目监督与控制。
  6. SAM:供应商协议管理。
  7. IPM:集成项目管理。
  8. RSKM:风险管理。
三、工程管理:
9. REQM:需求管理。
10. RD:需求开发。
11. TS:技术解决方案。
  12. PI:产品集成。
  13. VER:验证。
  14. VAL:确认。
  四、支持管理:
  15. CM:配置管理。
  16. PPQA:过程和产品质量保证。
  17. MA:测量与分析。
  18. DAR:决策分析与解决。
  CMMI 4级除第2、3级所涵盖的18个过程域外,增加以下两个过程域:
  19. OPP :组织过程性能。
  20. QPM:量化的项目管理 。
CMMI 5级包含第2级到第4级的20个过程域外,
增加以下两个过程域:
  21. OID:组织创新与推展。
  22. CAR:因果分析与解决方案。
CMMI模型表述阶段式:
  1、阶段式表述提供系统化与结构化的方式,一次一个阶段达到以模型为基础的过程改进。达成每一个阶段可确保有足够的过程基础建设,可作为下一个阶段过程改进的基础。
  2、连续式:连续式表述可提供最大的弹性。一个组织可以选择改进单一过程相关的问题点的绩效,或是可以使用多个领域以密切配合组织的经营目标。
 
极限编程(ExtremeProgramming,简称XP)是由KentBeck在1996年提出的。KentBeck在九十年代初期与WardCunningham共事时,就一直共同探索着新的软件开发方法,希望能使软件开发更加简单而有效。Kent仔细地观察和分析了各种简化软件开发的前提条件、可能性以及面临的困难。1996年三月,Kent终于在为DaimlerChrysler所做的一个项目中引入了新的软件开发观念——XP。适用于小团队开发。

 极限编程中有四个核心价值是我们在开发中必须注意的:沟通(Communication)、简单(Simplicity)、反馈(Feedback)、勇气(Courage)、此外还扩展了第五个价值观:谦逊(Modesty)。 

 

方法

基于敏捷的核心思想和价值目标,XP要求项目团队遵循13个核心实践
团队协作(Whole Team)
规划策略(The Planning Game);
结对编程(Pair programming)
测试驱动开发(Testing-Driven Development)
重构(Refactoring)
简单设计(Simple Design)
代码集体所有权(Collective Code Ownership)
持续集成(Continuous Integration)
客户测试(Customer Tests)
小型发布(Small Release)
每周40小时工作制(40-hour Week)
编码规范(Code Standards)
系统隐喻(System Metaphor)
 

极限编程的4个商业实践:

  • 测试驱动开发—TDD是你的商业安全网。因为测试是在编码之前完成的,所以写完的测试一定会运行失败,接下来再写代码使测试可以通过。TDD保证你的产品功能,不管公司和技术团队实现的是大规模的变更还是小规模的变更。
  • 结对编程—让2名开发人员写同一段代码,使用同一个键盘和同一台显示器。因为结对大大降低了浪费的时间和缺陷,所以能带来更高质量的代码,并带来高水平的协作。
  • 集体代码所有制和持续集成—如果每段代码不只有一个人熟悉,那么就不会有什么交流瓶颈了。把代码持续集成到一个主干可以避免重复和不匹配的代码。
  • 重构—在当时的情况下,写的代码是解决已知问题的。通常,团队巧妙地解决了他们的问题,然后持续重构和修改代码,确保代码库能以最为高效的方式不断满足业务最新的需要
  •  

 
 
 

RUP是一套管理方法,用于项目从需求到发布的管理而敏捷则是一种思想,一种价值观:价值迭代交付,以人为本有一些基于敏捷思想的实践比如Scrum、XP等也都是管理方法或开发方法层面的内容RUP可以与敏捷的思想结合,可以在敏捷思想指导下进行管理,那就是敏捷的RUP

XP 与CMM 、RUP 的比较
CMM 告诉组织为了系统化地建立、实施和改进软件开发过程应该做些什么,但没有说明如何去做以及采用哪些具体的技术、策略和方法。CMM 是一套通用的过程实践标准,适用面很广。实施CMM 要求组织在过程的制度化建设上付出大量努力,通常被认为是重载(heavy-weight)的模型。
XP 是一个针对某种特定环境(需求变化快的小型团队)的具体过程实施模型和方法论。它其实是一种演进式的原型化方法(evolutionary prototyping)[MCNL96],具有沟通高效、设计简单、反馈迅速等特点,因而是一种轻载(light-weight)、敏捷(agile) 的过程方法。
Mark Paulk 在他的文章中把XP 的实践方法与CMM 的KPA(关键过程域)进行了对照。得出的结论是,XP部分满足或大部分满足了CMM 2-3 级KPA 的要求,而基本上没有涉及CMM 4-5 级的KPA。这说明XP 的做法基本符合了CMM 的目标和KPA,但还不完备。总体上看,XP 侧重于具体的过程和开发技术,而CMM 更关注组织和管理上的问题。XP 缺少的一个重要内容是“制度化(institutionalization)”,它不含有被CMM 认为是使良好的工程和管理实践制度化的关键基础设施和管理要件。[PALK01]
RUP(Rational Unified Process)是一个风险驱动的基于UML 和构件式架构的迭代递增型开发过程(框架)。RUP 定义了4 个阶段(起始、细化、构造、移交)和9 个科目(业务建模、需求、分析和设计、实现、测试、部署、配置和变更管理、项目管理、环境)。这些阶段对应着关键里程碑的划分,而不同科目的工作流和活动 在生命周期的迭代中可以并发进行,具体执行的程度则可以调节。RUP 对于角色、流程、工件和活动的要求是灵活的、可配置的,所以它广泛地适用于各种类型和规模的项目。RUP 集中体现了6 个软件开发的最佳实践方法:迭代式开发、需求管理、构件式架构、基于UML 的可视化建模、持续校验质量、变更管理。RUP 是一种以架构为中心的开发过程,而这正是大、中型项目成功的关键。
XP 的编码和设计活动融为一体,弱化了架构的概念,这是它与强调架构设计的RUP 的最大不同。架构的内涵要远大于一些简单的隐喻,它要考虑结构、行为、环境、使用、功能、性能、可靠性、弹性、重用、可理解性、约束和权衡乃至美学等诸多 方面的因素。设计架构的目的不是为了完美地表示系统的全部细节,而是为了消除最主要和最关键的架构风险。RUP 细化阶段的主要目的就是构造出一个可运行的架构原型,作为将来添加需求功能的稳固基础。另外,XP 没有包含业务建模、部署等概念,反映了它以编程为中心、节省一切的哲学。
当然两者也有不少共同点。例如,它们的基础都是面向对象方法(取代传统的结构化方法),都重视代码、文档的最小化和设计的简化,采用动态适应变化的演进式迭代周期(取代传统的瀑布型生命周期)、需求和测试驱动并鼓励用户积极参与等等。
由 于RUP 提供了非常丰富的内容,所以常常被误解为一个重载的过程。通过定制RUP 这个通用的过程框架,去掉项目不必要的工件(artifacts)和中间环节,把XP 的做法(比如短小的迭代周期、结对编程、测试优先的设计和重构)吸收进来,也可以实现RUP 过程的敏捷和轻量化[SMTH01]。“Bob 大叔”(Robert Martin)甚至从RUP中裁剪出了一个酷似XP 的最小化RUP 过程——dx[MART01]。我设想,XP、RUP 乃至其他工程和管理方法可以统一起来使用,姑且成之为统一软件过程(Unified Software Process,USP)。例如,一个大项目团队在起始和细化阶段采用RUP 方法完成需求分析和架构设计,在构造和移交阶段采用XP 的做法来实现部分子系统或模块。
“轻载”、“敏捷”是美丽的词汇,无人会拒之于门外。我想XP、RUP 的目标是一致的——提高团队效率、开发出高质量的软件,而区别就在于各自的侧重点不同,从而导致两者的适用情况和应用范围有差异。然而,它们是可以互补 的,无论是以架构为中心,还是以代码为中心,灵活运用的关键就在于掌握其中的最佳实践方法,实施RUP、XP 或者融合了两者的过程(比如USP)都将有助于组织更好地实现CMM 目标。

 

项目

CMM/CMMI

RUP

MSF

XP

周期

螺旋模型。

演进式迭代周期,过程框架

瀑布模型和螺旋模型的结合

演进式迭代周期。软件开发方法学

核心

过程改进

架构、迭代

里程碑、迭代

以代码为中心。

范围

需求严格而极少变化的项目。

适合不同类型的项目

适合不同类型的项目

进度紧、需求不稳定的小项目、小型发布和小团队

组织

个人(PSP)、团队(TSP)和组织的3个层次,组间协作、培训

跨团队协作

强调产品的愿景,6种基本角色

以团队为基础,小团队、团队成员能力相当

技术

传统结构化方法

面向对象技术

综合技术

面向对象技术

管理

侧重于过程的定义、度量和改进。一切用数字和文档说话。

从组织角度出发,侧重于过程建模、部署。

业务建模、部署、过程管理等概念。

侧重于具体的过程执行和开发技术,计划设计。

活动

通过过程域来定义活动

整个团队在整个过程中关注质量

项目管理、风险管理和就绪管理

以人为本,如每周40小时工作制、结对编程

实践

各类级别的关键实践。

重视关键基础设施。

满足了CMM 2-3 级KPA 的要求,而基本上没有涉及CMM 4-5 级的KPA

代码复审、版本管理方法、文档管理、人员招聘、重测试和重风险管理等。

编码和设计活动融为一体,弱化了架构。

用例、单元测试、迭代开发和分层的架构。

其它

通用性强,但复杂、高成本。

 

强调风险驱动,以保障可用产品的持续性交付为前提,尽量减少不必要的过程工件,使度量、文档最小化以获得弹性和应变能力。

提供了一系列指南,用于规划企业的基础技术设施,流程化商业的运作过程,并鼓励重用性。

拥抱变化,强调人性化、简单、沟通。尽量减少文档。

个体和交互胜过过程和工具。

名词记忆