CAP理論,CAP原則又稱CAP定理,指的是在一個分佈式系統中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可得兼。java
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等領域,是一種能夠拿來就用的產品,而領域模型 + 分佈式緩存 + 存儲是一種複雜的架構解決方案,不是產品,但這種方式更靈活,更應該是架構師必須掌握的。web
一、RMI數據庫
使用java的程序員,對於RMI(RemoteMethod Invoke,遠程方法調用)必定不陌生,在java中,爲了在分佈式應用開發時,可以方便調用遠程對象,java提供了RMI的API。在 RMI 中,遠程對象按照好象它是本地行事,客戶機應用程序會直接調用遠程對象存根上的方法,所以,調用起來就如本地對象同樣方便。RMI中封裝了對象和請求的網 絡傳送,使得異地的對象服務直接可用。編程
但RMI的使用必須是在可以識別java代碼的環境下使用,即必須有JVM的支持。所以,他只適合在java程序間的對象通訊。若是不在 Java 環境下工做,或者須要與非 Java 環境通訊,那麼SOAP、RPC、CORAR等都是能夠的。.緩存
二、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 這樣的重型 範例吸引人的替代。數據結構
三、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,他們會看到極大的性能改善。
四、WSDL
WSDL(Web Services Description Language)是描述web服務的,是描述怎樣訪問web服務的。WSDL是用來描述SOAP的,換句話說,WSDL 文件告訴你調用 SOAP 所須要知道的一切。WSDL也是一段xml。如今各個語言對wsdl的支持都很成熟,能夠根據同一份wsdl文件生成本身語言的客戶端。
五、REST
須要注意的是,REST是設計風格而不是標準。REST一般基於使用HTTP,URI,和XML(標準通用標記語言下的一個子集)以及HTML(標準通用標記語言下的一個應用)這些現有的普遍流行的協議和標準。REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)
極限編程中有四個核心價值是咱們在開發中必須注意的:溝通(Communication)、簡單(Simplicity)、反饋(Feedback)、勇氣(Courage)、此外還擴展了第五個價值觀:謙遜(Modesty)。
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 |
代碼複審、版本管理方法、文檔管理、人員招聘、重測試和重風險管理等。 |
編碼和設計活動融爲一體,弱化了架構。 用例、單元測試、迭代開發和分層的架構。 |
其它 |
通用性強,但複雜、高成本。
|
強調風險驅動,以保障可用產品的持續性交付爲前提,儘可能減小沒必要要的過程工件,使度量、文檔最小化以得到彈性和應變能力。 |
提供了一系列指南,用於規劃企業的基礎技術設施,流程化商業的運做過程,並鼓勵重用性。 |
擁抱變化,強調人性化、簡單、溝通。儘可能減小文檔。 個體和交互賽過過程和工具。 |