首页 > 代码库 > 名词记忆
名词记忆
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)
实施流程
一、过程管理:
1. OPD:组织级过程定义。
2. OPF:组织级过程焦点。
3. OT:组织培训管理。
二、项目管理:
4. PP:项目计划。
5. PMC:项目监督与控制。
6. SAM:供应商协议管理。
7. IPM:集成项目管理。
8. RSKM:风险管理。
12. PI:产品集成。
13. VER:验证。
14. VAL:确认。
四、支持管理:
15. CM:配置管理。
16. PPQA:过程和产品质量保证。
17. MA:测量与分析。
18. DAR:决策分析与解决。
CMMI 4级除第2、3级所涵盖的18个过程域外,增加以下两个过程域:
19. OPP :组织过程性能。
20. QPM:量化的项目管理 。
21. OID:组织创新与推展。
22. CAR:因果分析与解决方案。
1、阶段式表述提供系统化与结构化的方式,一次一个阶段达到以模型为基础的过程改进。达成每一个阶段可确保有足够的过程基础建设,可作为下一个阶段过程改进的基础。
极限编程中有四个核心价值是我们在开发中必须注意的:沟通(Communication)、简单(Simplicity)、反馈(Feedback)、勇气(Courage)、此外还扩展了第五个价值观:谦逊(Modesty)。
方法
极限编程的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 | 代码复审、版本管理方法、文档管理、人员招聘、重测试和重风险管理等。 | 编码和设计活动融为一体,弱化了架构。 用例、单元测试、迭代开发和分层的架构。 |
其它 | 通用性强,但复杂、高成本。
| 强调风险驱动,以保障可用产品的持续性交付为前提,尽量减少不必要的过程工件,使度量、文档最小化以获得弹性和应变能力。 | 提供了一系列指南,用于规划企业的基础技术设施,流程化商业的运作过程,并鼓励重用性。 | 拥抱变化,强调人性化、简单、沟通。尽量减少文档。 个体和交互胜过过程和工具。 |
名词记忆