序
本文主要聊聊演進式架構
Evolutionary Architecture
它的定義原文如下:
An evolutionary architecture supports incremental, guided change as a first principle across multiple dimensions.
翻譯過來大致是演進式架構是一種支援將增量式、指導式的變更作為跨多個維度中的第一原則的架構。
這裡涉及到幾個要素:
- Incremental change
- Guided change with fitness functions
- Appropriate coupling
Incremental change
增量式變更主要包含兩大部分,一個是軟體是如何增量構建,一個是它們是如何部署。
Incremental change describes two aspects of software architecture: how teams build software incrementally and how they deploy it.
其中增量構建,比如向前相容,多版本支援;部署的話,比如藍綠部署、金絲雀部署、feature toggles等。
它要求這些變更是可逆的,即可以回滾。當然有些架構是用來拋棄/犧牲的。比如可犧牲的架構中提到的:
支援1996年eBay的合適架構,對於2006年eBay來說,就不是合適的了。1996年的架構無法處理2006年的負載,但是2006年的版本太過複雜而難以建立、維護,它是根據1996年的需求演化而來的。的確,這個原則可以引出工作的一種組織方式。在Google,大家熟知的要求就是設計一個滿足當前10倍需求的系統,這暗示著如果需求超過了一個數量級,那麼扔掉並從頭做起是更好的。每隔幾年就被重新設計與拋棄的子系統而言,這是非常普遍的。
複製程式碼
Guided change with fitness functions
英文定義如下:
\a particular type of objective function that is used to summarize…how close a given design solution is to achieving the set aims.
它是一個目標函式,用來指導我們如何進行tradeoff來滿足選中的capability。
定義fitness function的前提就是確定當前演進式架構中需要保持哪些capability,哪些capability可以被弱化或移除。
如圖,這裡選中的的10個capability中High Thoughput和Data Security作為最高優先順序的目標。
完整的capability(system quality attributes
)如下:
accessibility
accountability
accuracy
adaptability
administrability
affordability
agility [Toll] (see Common Subsets below)
auditability
autonomy [Erl]
availability
compatibility
composability [Erl]
configurability
correctness
credibility
customizability
debugability
degradability
determinability
demonstrability
dependability
deployability
discoverability [Erl]
distributability
durability
effectiveness
efficiency
evolvability
extensibility
failure transparency
fault-tolerance
fidelity
flexibility
inspectability
installability
integrity
interchangeability
interoperability [Erl]
learnability
maintainability
manageability
mobility
modifiability
modularity
operability
orthogonality
portability
precision
predictability
process capabilities
producibility
provability
recoverability
relevance
reliability
repeatability
reproducibility
resilience
responsiveness
reusability [Erl]
robustness
safety
scalability
seamlessness
self-sustainability
serviceability (a.k.a. supportability)
securability
simplicity
stability
standards compliance
survivability
sustainability
tailorability
testability
timeliness
traceability
transparency
ubiquity
understandability
upgradability
vulnerability
usability
複製程式碼
Appropriate coupling
沒有完美的能夠應對所有變化的架構,技術架構很多時候是依據當時的技術條件來設計的,當制約因素改變的時候,技術架構也要相應變化。比如以前只有關係型資料庫,很多設計都圍繞正規化來,現在有了nosql,就不需要都採用關係型資料庫,可以引入polyglot架構,什麼資料適合nosql,什麼適合關係型資料庫,可以自由選擇。
因而Appropriate coupling就是演進式架構的核心,用來進行tradeoff,哪些可以以最小的代價提供最好的收益而允許適度耦合。比如微服務架構就非常反對service hub這種程式碼級別的複用依賴導致的耦合,而更傾向於使用rest及拷貝程式碼來解耦。當然如果說這些service hub已經很成熟了,基本不會快速變更/迭代或者有不相容的事情,那麼適度的採用service hub耦合也是可以的,但是如果依賴的service hub在高速迭代和變更中,那麼這種耦合就相對嚴重些,具體需要根據不同的場景來進行取捨。
小結
evolutionary架構與predictable架構不同,predictable是類似靜態式的架構,依賴於預測未來的變化,而沒有一種架構是能夠應付所有的未知變化的,evolutionary架構則是擁抱未知的變化,在不同的變化中不斷取捨,進行演進。