架構(gòu)入門與架構(gòu)師職責(zé)-淺談

原文鏈接: https://blog.csdn.net/qq_38619183/article/details/107578076

這篇文章只是我對(duì)于架構(gòu)認(rèn)識(shí)的一些觀點(diǎn)影锈,如果您不認(rèn)同我的觀點(diǎn)或想和我討論的話佛析,十分歡迎評(píng)論指教。希望本文能幫助您在架構(gòu)設(shè)計(jì)的路上多一點(diǎn)思考。

本篇文章主要講架構(gòu)的一些定義和架構(gòu)師的職責(zé),最后還有一些如何設(shè)計(jì)架構(gòu)的原則和觀點(diǎn)。在開始正文前我先拋出3個(gè)問題:

  1. 什么是架構(gòu)? 框架冷守、架構(gòu)、模塊剪况、組件的區(qū)別與聯(lián)系是什么?
  2. 架構(gòu)師的定義是什么? 他到底是做什么的? 什么是稱職的架構(gòu)師?
  3. 架構(gòu)師如何設(shè)計(jì)出高性能教沾、高擴(kuò)展性、高可用性的架構(gòu)?

1. 架構(gòu)

1.1 什么是架構(gòu)

先看看wiki百科給的架構(gòu)的定義:

軟件架構(gòu)是一個(gè)系統(tǒng)的草圖译断。軟件架構(gòu)描述的對(duì)象是直接構(gòu)成系統(tǒng)的抽象組件。各個(gè)組件之間的連接則明確和相對(duì)細(xì)致地描述組件之間的通訊或悲。在實(shí)現(xiàn)階段孙咪,這些抽象組件被細(xì)化為實(shí)際的組件,比如具體某個(gè)類或者對(duì)象巡语。在面向?qū)ο箢I(lǐng)域中翎蹈,組件之間的連接通常用接口來實(shí)現(xiàn)。

軟件架構(gòu)本質(zhì)是為了滿足客戶需求而需要的設(shè)計(jì)方案男公,它描述模塊荤堪、組件以及它們之間的關(guān)系。其實(shí)wiki百科中給的解釋還把軟件架構(gòu)和建筑物的架構(gòu)作類比枢赔,但我認(rèn)為它們之間是有很大的不同的澄阳。
軟件擁有一個(gè)很大的特點(diǎn),就是易變性踏拜,他所依賴的需求不穩(wěn)定碎赢。所以要求架構(gòu)師所創(chuàng)造的東西具有足夠的靈活性,并且能夠根據(jù)用戶的需求進(jìn)行演化速梗。

1.2 那框架和架構(gòu)到底是什么關(guān)系呢? 模塊和組件是什么關(guān)系呢?

框架是: 為了實(shí)現(xiàn)某個(gè)業(yè)界標(biāo)準(zhǔn)或完成特定基本任務(wù)的軟件組件規(guī)范肮塞,也指為了實(shí)現(xiàn)某個(gè)軟件組件規(guī)范時(shí),提供規(guī)范所要求之基礎(chǔ)功能的軟件產(chǎn)品姻锁。

  • 可以舉例出: MVC框架枕赵,springMVC框架就是其中的一個(gè)特別實(shí)現(xiàn)。它定義了一組軟件規(guī)范位隶,并且以注解的形式提供了該框架的基礎(chǔ)功能拷窜。

模塊和組件的關(guān)系其實(shí)只是角度上的差別。模塊設(shè)計(jì)的作用是職責(zé)分離; 組件設(shè)計(jì)的作用是單元復(fù)用。

  • 從軟件邏輯上看装黑,一個(gè)大的學(xué)生管理系統(tǒng)可以劃分為學(xué)生登入管理系統(tǒng)副瀑、學(xué)生信息管理系統(tǒng)等;
  • 從物理角度看,又可以看成數(shù)據(jù)庫組件恋谭、ngix組件等糠睡。

1.3 架構(gòu)要素和架構(gòu)設(shè)計(jì)套路

設(shè)計(jì)一個(gè)架構(gòu)要注意什么方面呢(可能不完善還請(qǐng)見諒):

  1. 職責(zé)明確的模塊和組件(高內(nèi)聚和低耦合的體現(xiàn))
  2. 組件間明確的關(guān)聯(lián)關(guān)系(一對(duì)多?一對(duì)一?多對(duì)多?)
  3. 詳細(xì)清晰的約束和指導(dǎo)原則(例如:單一原則、里式替換原則疚颊、開閉原則以及依據(jù)業(yè)務(wù)自定義的其他原則等)

以下是架構(gòu)師的一般性設(shè)計(jì)套路狈孔,關(guān)于架構(gòu)師定義和職責(zé)相關(guān)的在后文會(huì)提及:

  • 定義問題->確定架構(gòu)->提出方案->落地。

一個(gè)架構(gòu)設(shè)計(jì)最難得地方就是定義問題的部分: 什么是最需要注意? 什么是系統(tǒng)的瓶頸所在? 在這一步要看清主次矛盾材义,但也要注意主次矛盾是會(huì)互相變換的(從這點(diǎn)看均抽,架構(gòu)師還需要點(diǎn)哲學(xué)的思想呢哈哈)。
例如當(dāng)業(yè)務(wù)比較小時(shí)其掂,特別是初創(chuàng)公司油挥,可能成本是首要矛盾,而對(duì)于大型公司款熬、或業(yè)務(wù)從小發(fā)展到大深寥,成本可能不再是首要矛盾,TPS贤牛、QPS這些性能方面的東西可能是首要注意點(diǎn)惋鹅。
而對(duì)于定位問題,要有打破砂鍋問到底精神(5why分析法)殉簸,如下圖所示闰集,最初知識(shí)想要提升用戶體驗(yàn),但隨著不斷的深入研究探索般卑,發(fā)現(xiàn)了更多的需要注定的點(diǎn)武鲁,這時(shí)架構(gòu)師可能就得利用自己經(jīng)驗(yàn)來判斷出哪個(gè)才是首要矛盾。


在這里插入圖片描述

架構(gòu)設(shè)計(jì)如此復(fù)雜且吃經(jīng)驗(yàn)椭微,那有沒有一些架構(gòu)設(shè)計(jì)的原則指導(dǎo)呢?

1.4 架構(gòu)設(shè)計(jì)原則

雖然架構(gòu)設(shè)計(jì)總是伴隨著需求的不確定性洞坑、技術(shù)選型的復(fù)雜性,但架構(gòu)設(shè)計(jì)還是可以總結(jié)出三個(gè)原則蝇率,分別是: 合適原則迟杂、簡單原則、演化原則本慕。

1.4.1 合適原則

看業(yè)務(wù)是否需要排拷,是否必要、是否合適锅尘。很多技術(shù)人員成為架構(gòu)師總是會(huì)有一些技術(shù)上的渴求监氢,想要設(shè)計(jì)出最牛的最好的架構(gòu)布蔗,但往往這樣的架構(gòu)要么設(shè)計(jì)不出來,要么復(fù)雜度太高浪腐,實(shí)現(xiàn)成本太高纵揍。
架構(gòu)設(shè)計(jì)是服務(wù)于業(yè)務(wù)的。架構(gòu)設(shè)計(jì)的本質(zhì)其實(shí)是取舍(這就需要架構(gòu)師擁有足夠的技術(shù)儲(chǔ)備)议街,架構(gòu)設(shè)計(jì)沒有銀彈泽谨,只有針對(duì)不同的業(yè)務(wù)情況進(jìn)行設(shè)計(jì)才能設(shè)計(jì)出好的架構(gòu)。
舉一個(gè)學(xué)生管理系統(tǒng)的例子: 作為學(xué)生管理系統(tǒng)特漩,進(jìn)入流量的大小大致是有數(shù)而且不大的吧雹,不需要進(jìn)行高性能的設(shè)計(jì),高可擴(kuò)展性也是不太需要的涂身,但如果數(shù)據(jù)庫宕機(jī)了甚至機(jī)器壞了雄卷,學(xué)生數(shù)據(jù)就得管理人員一條一條的輸入,這是很麻煩的蛤售,所以需要足夠的可用性丁鹉。

1.4.2 簡單原則

能用簡單的技術(shù)滿足需要就不要給自己的團(tuán)隊(duì)增加工作量。在合適原則的基礎(chǔ)上盡量選擇團(tuán)隊(duì)成員最熟悉的悍抑,技術(shù)上實(shí)現(xiàn)最簡單的鳄炉。越復(fù)雜的技術(shù)對(duì)研發(fā)人員的要求就越高,維護(hù)的成本也會(huì)增加搜骡。

1.4.3 演化原則

不要試圖一開始進(jìn)行"長遠(yuǎn)考慮",過度的提前設(shè)計(jì)只會(huì)把整個(gè)團(tuán)隊(duì)拖入泥潭佑女。
要做好不斷迭代優(yōu)化的準(zhǔn)備记靡,在開發(fā)的層面上可以采用敏捷開發(fā)的思想(敏捷開發(fā)也說明過度設(shè)計(jì)是弊大于利的)。

雖然說架構(gòu)師所要設(shè)計(jì)的業(yè)務(wù)需求是不斷變化的(特別是當(dāng)今的互聯(lián)網(wǎng)行業(yè))团驱,但要想捕捉到未來的需求是十分難的摸吠,首先是確定未來可能的需求變化,接著針對(duì)這種變化進(jìn)行針對(duì)性設(shè)計(jì)嚎花〈缌。可是誰也不能保證架構(gòu)師所預(yù)計(jì)的需求變化真的會(huì)發(fā)生。如果不發(fā)生紊选,輕則浪費(fèi)了研發(fā)資源啼止,重則對(duì)之后的開發(fā)還有負(fù)面影響。
架構(gòu)師要審慎的進(jìn)行"面向未來"設(shè)計(jì)兵罢,畢竟沒有一種架構(gòu)設(shè)計(jì)是銀彈献烦,不要太深入到一種架構(gòu)設(shè)計(jì)中去,保留足夠的變更空間卖词。

2. 架構(gòu)師

軟件架構(gòu)的功能是控制軟件的復(fù)雜度巩那。軟件架構(gòu)師的工作就是控制軟件的復(fù)雜度。
軟件的復(fù)雜度在于一臺(tái)機(jī)器和不同機(jī)器間。例如: 同一臺(tái)機(jī)器內(nèi)有同步/異步的選型; 不同的機(jī)器間有狀態(tài)機(jī)的選型即横。

自從軟件出生以來噪生,軟件開發(fā)和軟件的復(fù)雜度一直如影隨行。從最早的機(jī)器語言东囚,到中低級(jí)編程語言跺嗽,到軟件工程、面向?qū)ο蟪霈F(xiàn)舔庶,都在處理軟件復(fù)雜的的問題抛蚁。但是軟件復(fù)雜度的解決方案也沒有銀彈。之后軟件規(guī)模越來越大惕橙,甚至出現(xiàn)了分布式的軟件系統(tǒng)瞧甩,對(duì)于大型軟件,架構(gòu)設(shè)計(jì)越來越有必要弥鹦。

2.1 架構(gòu)師職責(zé)

讓我看看看wiki上的定義:

是在信息系統(tǒng)研發(fā)中肚逸,負(fù)責(zé)依據(jù)需求來確定主要的技術(shù)選擇、設(shè)計(jì)系統(tǒng)的主體框架結(jié)構(gòu)彬坏,并負(fù)責(zé)搭建實(shí)施的人朦促。[1] 他們(與系統(tǒng)分析師共同)確立系統(tǒng)的主體架構(gòu)和實(shí)現(xiàn)方向,并負(fù)責(zé)指導(dǎo)軟件工程師等開發(fā)人員的編碼開發(fā)工作栓始。

讓我抽取出一些核心的概念: 技術(shù)選擇务冕、負(fù)責(zé)搭建實(shí)施、指導(dǎo)軟件工程師幻赚。
在目前的業(yè)界情況禀忆,其實(shí)還可以用五個(gè)字來概括軟件架構(gòu)師: 人、財(cái)落恼、物箩退、是、事佳谦。其實(shí)軟件架構(gòu)師管理的不僅僅是軟件戴涝,還有管理團(tuán)隊(duì)。敏捷開發(fā)和<<微服務(wù)設(shè)計(jì)>>都說明:

在最理想的情況下钻蔑,架構(gòu)師應(yīng)該和開發(fā)人員一起編碼啥刻,如果架構(gòu)師實(shí)在很忙那也應(yīng)該和開發(fā)人員一起工作。

架構(gòu)師本質(zhì)工作是管理人員矢棚,或者就是管理開發(fā)人員郑什。所以系統(tǒng)架構(gòu)的設(shè)計(jì)也需要和團(tuán)隊(duì)組織結(jié)構(gòu)具有足夠的一致性。技術(shù)選型也是如此蒲肋。
不僅不能成為所謂的"ppt架構(gòu)師"蘑拯,也不能成為架構(gòu)設(shè)計(jì)出來后就甩手而去的"架構(gòu)師"钝满。架構(gòu)師在團(tuán)隊(duì)開發(fā)的過程中要保證團(tuán)隊(duì)具有良好的開發(fā)節(jié)奏(開發(fā)、測(cè)試申窘、部署弯蚜,做好增量開發(fā)部署的準(zhǔn)備),把握好開發(fā)進(jìn)度(立會(huì)制度就很好)剃法。此處額外說明下: 立會(huì)就是站著開會(huì)的意思碎捺,在立會(huì)上不要深入討論開發(fā)細(xì)節(jié),主要目的是了解開發(fā)進(jìn)度贷洲,最好時(shí)間控制在10~15m之間收厨。同時(shí)也能培養(yǎng)出"代碼集體所有制"的氛圍,避免單人負(fù)責(zé)導(dǎo)致思維盲點(diǎn)优构。

同時(shí)诵叁,擁抱變化而不要畏懼變化。

2.2 架構(gòu)設(shè)計(jì)淺談

2.2.1 CAP原理

CAP三個(gè)大寫字符分別是: Consistency(一致性)钦椭、Availability(可用性)拧额、Partition tolerance(分區(qū)容忍性)。
C和A比較好理解彪腔,那P是什么意思呢? 我的理解是: 忍的是"同步時(shí)間差"侥锦。在多實(shí)例下,實(shí)例間的狀態(tài)同步需要一定的時(shí)間德挣,所以多實(shí)例下P必然要成立恭垦。
更多CAP的相關(guān)信息可以看這里: https://zhuanlan.zhihu.com/p/20399316

2.2.2 高性能、高可用格嗅、高擴(kuò)展相關(guān)

高性能和高可用本質(zhì)上都是通過加機(jī)器來實(shí)現(xiàn)署照。高性能目標(biāo)的加機(jī)器叫擴(kuò)展,高可用的加機(jī)器叫冗余吗浩。

高性能是軟件架構(gòu)最復(fù)雜的地方。軟件架構(gòu)的復(fù)雜性在高性能上可以體現(xiàn)在兩個(gè)方面:

  1. 單臺(tái)計(jì)算機(jī)內(nèi)部復(fù)雜度: 線程\進(jìn)程没隘、阻塞\非阻塞等懂扼。
  2. 多臺(tái)機(jī)器之間的復(fù)雜交互: 異步\同步、消息隊(duì)列右蒲、請(qǐng)求/響應(yīng)阀湿、事件/訂閱等。

高可用加機(jī)器是為了擴(kuò)展性能瑰妄,往往伴隨著狀態(tài)決策機(jī)制陷嘴。狀態(tài)決策機(jī)制有三種:

  1. 獨(dú)裁式。一臺(tái)機(jī)器進(jìn)行狀態(tài)決策间坐,可用性不夠灾挨。
  2. 協(xié)商式邑退。主備或主從形式。
  3. 民主式劳澄。zookeeper中的paxos變體算法就是民主式地技。民主式會(huì)有一個(gè)"腦裂"的問題(因?yàn)橥ㄐ攀?dǎo)致有多個(gè)決策主體發(fā)布狀態(tài)信息),所以往往要求超過一半的投票次數(shù)滿足了才能通過對(duì)應(yīng)的"提議"秒拔。

高可用分為計(jì)算高可用莫矗、存儲(chǔ)高可用、應(yīng)用高可用砂缩。常見的高可用方案有加機(jī)器且負(fù)載均衡路由作谚、冗余備份、超時(shí)設(shè)置庵芭、異步調(diào)用(解耦)妹懒、服務(wù)降級(jí)保護(hù)、監(jiān)控告警喳挑、灰度發(fā)布和回滾機(jī)制等彬伦。

高擴(kuò)展性的設(shè)計(jì)在飛快變化的需求面前往往是必不可少的。設(shè)計(jì)高可用的架構(gòu)首先在于識(shí)別業(yè)務(wù)可能會(huì)發(fā)生的變化伊诵。識(shí)別出變化點(diǎn)后单绑,套用高耦合低內(nèi)聚的原則、單一原則曹宴、依賴倒置原則等搂橙,模塊和模塊間的通信也設(shè)計(jì)成盡量穩(wěn)定的或易于修改的(客戶端和服務(wù)端公用一套公共庫是一件很糟糕的事情)。
設(shè)計(jì)高擴(kuò)展性架構(gòu)時(shí)同時(shí)要記住不要過度設(shè)計(jì)笛坦。大服務(wù)拆分成小服務(wù)比小服務(wù)設(shè)計(jì)出來后不合適于業(yè)務(wù)要重新開發(fā)成本要低多了区转。
關(guān)于高擴(kuò)展性的更多可以參考這里: https://www.cnblogs.com/dimmacro/p/4568905.html

2.2.3 安全、成本

安全也是架構(gòu)的一個(gè)重要方面版扩,架構(gòu)安全可以大致分為兩個(gè)方面:

  1. 功能安全
  2. 架構(gòu)安全

功能安全像是防小偷废离,大致可能的威脅來源有:XSS漏洞、CSRF漏洞礁芦、SQL漏洞蜻韭、越權(quán)漏洞等。
架構(gòu)安全像是防強(qiáng)盜柿扣,往往類型像是給架構(gòu)一記重重拳擊肖方,動(dòng)輒幾十上百TB的流量沖擊,擊穿緩存未状、擊垮數(shù)據(jù)庫等俯画。

成本對(duì)于架構(gòu)設(shè)計(jì)來說,相當(dāng)于一個(gè)約束司草。在設(shè)計(jì)高可用艰垂、高擴(kuò)展等"高"架構(gòu)時(shí)泡仗,成本往往是對(duì)這些追求的限制,要想突破限制只能通過創(chuàng)新來實(shí)現(xiàn)既降低成本又"高"的架構(gòu)材泄。

參考資料

  1. 高可用: https://zhuanlan.zhihu.com/p/28059511
  2. 高性能: https://my.oschina.net/jayqqaa12/blog/3161787
  3. https://www.cnblogs.com/dimmacro/p/4568905.html
  4. <<微服務(wù)設(shè)計(jì)>>
  5. <<高效程序員的45個(gè)習(xí)慣>>
  6. 極客時(shí)間: 從0開始學(xué)架構(gòu)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沮焕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拉宗,更是在濱河造成了極大的恐慌峦树,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旦事,死亡現(xiàn)場離奇詭異魁巩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)姐浮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門谷遂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卖鲤,你說我怎么就攤上這事肾扰。” “怎么了蛋逾?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵集晚,是天一觀的道長。 經(jīng)常有香客問我区匣,道長偷拔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任亏钩,我火速辦了婚禮莲绰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姑丑。我一直安慰自己蛤签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布栅哀。 她就那樣靜靜地躺著顷啼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昌屉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天茵瀑,我揣著相機(jī)與錄音间驮,去河邊找鬼。 笑死马昨,一個(gè)胖子當(dāng)著我的面吹牛竞帽,可吹牛的內(nèi)容都是我干的扛施。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼屹篓,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼疙渣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堆巧,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤妄荔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谍肤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啦租,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年荒揣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篷角。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡系任,死狀恐怖恳蹲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俩滥,我是刑警寧澤嘉蕾,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站举农,受9級(jí)特大地震影響荆针,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颁糟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一航背、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棱貌,春花似錦玖媚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至障贸,卻和暖如春错森,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篮洁。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工涩维, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袁波。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓瓦阐,卻偏偏與公主長得像蜗侈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睡蟋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345