概述
微服務(wù)架構(gòu)是一種非常流行的新概念水孩,即便可供以借鑒的經(jīng)驗(yàn)比較少昌罩,當(dāng)然不能阻擋它成為熱門話題與研究對(duì)象。
令人驚訝地是饭冬,其實(shí)微服務(wù)的概念早在五十多年前就已經(jīng)被提出使鹅,多年來,很久研究表明了這些觀點(diǎn)的準(zhǔn)確性昌抠。這就是本文所介紹的——康威定律』贾欤現(xiàn)在已經(jīng)有很多企業(yè)正在嘗試使用它創(chuàng)建高效的微服務(wù)架構(gòu)。
在這篇文章中最有名的一句話莫過于:
設(shè)計(jì)系統(tǒng)的企業(yè)受限于生產(chǎn)設(shè)計(jì)炊苫,這些設(shè)計(jì)是企業(yè)溝通結(jié)構(gòu)的副本——Melvin Conway(1967)裁厅。
這意味著設(shè)計(jì)系統(tǒng)的企業(yè),它們生產(chǎn)的設(shè)計(jì)等同于企業(yè)內(nèi)的溝通結(jié)構(gòu)侨艾。下圖說明了此概念:
該圖展現(xiàn)了企業(yè)現(xiàn)有溝通結(jié)構(gòu)执虹,簡單地說:企業(yè)結(jié)構(gòu)等于系統(tǒng)設(shè)計(jì)。
作者這里提到的系統(tǒng)并不局限于應(yīng)用系統(tǒng)唠梨,據(jù)說這篇文章最初投稿于哈佛商業(yè)評(píng)論袋励,但被拒絕,因此康威將其提交到了一個(gè)編程雜志当叭,所以被誤解為只針對(duì)應(yīng)用開發(fā)茬故,起初,作者并沒有把這種理論作為定律蚁鳖,只是描述了發(fā)現(xiàn)和結(jié)論磺芭,不過著名的《The Mythical Man-Month》一書介紹了Brooks的理論,并引用了康威的一些觀點(diǎn)醉箕,于是康威的理論被推崇成為我們現(xiàn)在所熟知的康威定律徘跪。
康威定律詳細(xì)介紹
在文章中,Mike Amundesn總結(jié)了一些核心觀點(diǎn):
第一定律:企業(yè)溝通方式會(huì)通過系統(tǒng)設(shè)計(jì)表達(dá)出來
第二定律:再多的時(shí)間也沒辦法讓任務(wù)完美至極琅攘,但總有時(shí)間能將它完成
第三定律:線型系統(tǒng)和線型組織架構(gòu)間有潛在的異質(zhì)同態(tài)特性
第四定律:大系統(tǒng)比小系統(tǒng)更適用于任務(wù)分解
康威第一定律
人類是復(fù)雜的社會(huì)動(dòng)物垮庐。”
其他領(lǐng)域也提供了一些關(guān)于溝通和系統(tǒng)設(shè)計(jì)之間緊密關(guān)系的例證坞琴,對(duì)于一個(gè)復(fù)雜的系統(tǒng)哨查,設(shè)計(jì)主題總會(huì)涉及到人們之間的交流,一個(gè)好的系統(tǒng)設(shè)計(jì)能解決這種溝通問題剧辐,很多老程序員都讀過《The Mythical Man-Month》寒亥,里面的一些觀點(diǎn)都是這句話的佐證邮府。
《The Mythical Man-Month》 這本書里有一句令人難忘的話:在應(yīng)用項(xiàng)目后期加大人員的投資,會(huì)更加拖慢它的速度溉奕」涌——Fred Brooks(1975)
增加開發(fā)者的數(shù)量以跟上緊湊的進(jìn)度是許多企業(yè)常見的問題,雖然增加勞動(dòng)以達(dá)到增加產(chǎn)出的目的是有意義的加勤,但在溝通成本上也會(huì)大大增加——隨著項(xiàng)目或企業(yè)中的人員數(shù)量增加仙辟,溝通成本成指數(shù)級(jí)增長,它可以通過公式n(n-1)/2來計(jì)算鳄梅,而項(xiàng)目管理算法的復(fù)雜度是O(N 2)叠国,下面的例子說明了溝通成本的概念:
5人團(tuán)隊(duì),需要溝通的渠道是 5(5–1)/2 = 10
15人團(tuán)隊(duì)戴尸,需要溝通的渠道是15(15–1)/2 = 105
50人團(tuán)隊(duì)粟焊,需要溝通的渠道是50(50–1)/2 = 1,225
150人團(tuán)隊(duì),需要溝通的渠道是150(150–1)/2 = 11,175
這也就是互聯(lián)網(wǎng)創(chuàng)業(yè)公司一般都比較小的原因孙蒙,如果創(chuàng)業(yè)公司有太多的員工项棠,Boos向每個(gè)人介紹自己的想法重荠,那么風(fēng)投估計(jì)也快花完了般妙。
生物學(xué)家Dunbar在1992年提出了一個(gè)名為Dunbar Number的理論:靈長類動(dòng)物的大腦容量與它的族群大小有關(guān),然后推論出一些人類大腦能夠維持的關(guān)系數(shù)量蜡坊,例如浑测,一個(gè)典型的人會(huì)有:
5個(gè)死黨
15個(gè)信任的朋友
35個(gè)一般的朋友
150個(gè)只打過照面的朋友
所以它們與上面提到的溝通成本有關(guān),大腦只能維持這么多的關(guān)系(在開發(fā)團(tuán)隊(duì)中歪玲,這個(gè)數(shù)字可能更星ㄑ搿)。
溝通的問題會(huì)影響系統(tǒng)設(shè)計(jì)滥崩,進(jìn)而影響整個(gè)系統(tǒng)的開發(fā)效率以及最終結(jié)果岖圈。
康威第二定律
羅馬不是一天建成的,學(xué)會(huì)先解決首要問題钙皮。
敏捷開發(fā)巨頭之一Erik Hollnagel 在他的書中闡述了類似的觀點(diǎn):
問題太復(fù)雜蜂科?那么不妨忽略不必要的細(xì)節(jié)。
沒有足夠的資源短条?放棄無用的功能导匣。
——Erik Hollnagel(2009)
系統(tǒng)的復(fù)雜性、功能數(shù)量茸时、市場競爭以及投資人的期望值都在增加贡定,而人的智力是有上限的,沒有企業(yè)能說一定能找到合適的人可都,對(duì)于一個(gè)極其復(fù)雜的系統(tǒng)缓待,總會(huì)有考慮不周全的地方蚓耽,Erik認(rèn)為這個(gè)問題最好的解決辦法就是:不去管它。
在日常開發(fā)任務(wù)匯總會(huì)遇到一些問題如旋炒,產(chǎn)品經(jīng)理提出的要求是否過于復(fù)雜步悠?如果是,首先關(guān)注那些主要的需求瘫镇,忽略次要的需求鼎兽,產(chǎn)品經(jīng)理的需求太多了?那就放棄一些功能汇四。
據(jù)稱接奈,Erik曾收到一家航空公司的顧問邀請(qǐng),保證飛行系統(tǒng)的穩(wěn)定性和安全性通孽,他相信通過兩種方式可以確保安全性:
常規(guī)安全:必須檢測和消除盡可能多的錯(cuò)誤
非常規(guī)安全:若出現(xiàn)錯(cuò)誤序宦,要及時(shí)處理,最快恢復(fù)服務(wù)
對(duì)于像飛行系統(tǒng)這樣復(fù)雜的系統(tǒng)背苦,不管測試人員的業(yè)務(wù)多么純熟互捌,也會(huì)忽略一些漏洞,因此Erik建議公司放棄建立一個(gè)完美系統(tǒng)的想法行剂,盡量去保證安全和正確性秕噪,通過不斷地飛行測試,去識(shí)別安全問題厚宰,確保系統(tǒng)能夠在出現(xiàn)故障時(shí)自動(dòng)回復(fù)腌巾,下圖顯示了安全的不同解釋。
聽起來是不是很熟悉铲觉?沒錯(cuò)澈蝙,這就是我們常說的持續(xù)集成和敏捷開發(fā)的概念。
而這個(gè)原則與互聯(lián)網(wǎng)公司維護(hù)的分布式系統(tǒng)彈性設(shè)計(jì)也相同撵幽,即使單元測試覆蓋整個(gè)系統(tǒng)灯荧,也不不可能識(shí)別和修復(fù)分布式系統(tǒng)中所有的缺陷,分布式系統(tǒng)很容易出現(xiàn)錯(cuò)誤盐杂,最佳解決方案不是消除所有問題逗载,而是允許它們存在,在發(fā)生故障時(shí)實(shí)現(xiàn)自動(dòng)恢復(fù)链烈。
在由微服務(wù)組成的系統(tǒng)中厉斟,每個(gè)微服務(wù)都可能停止響應(yīng),這是完全正常的强衡,只需要確保足夠的冗余和備份捏膨,這就是彈性或高可用性設(shè)計(jì)。
康威第三定律
創(chuàng)建獨(dú)立的子系統(tǒng),減少溝通成本号涯。
上圖代表了第一定律的團(tuán)隊(duì)和系統(tǒng)設(shè)計(jì)之間的內(nèi)部關(guān)系具體應(yīng)用目胡,簡單地說,需要建立一個(gè)適合自身系統(tǒng)的團(tuán)隊(duì)链快,如果有一個(gè)前端團(tuán)隊(duì)誉己、Java后端開發(fā)團(tuán)隊(duì)、DBA團(tuán)隊(duì)和O&M團(tuán)隊(duì)域蜗,那么系統(tǒng)將會(huì)如下圖:
相反巨双,如果系統(tǒng)是以業(yè)務(wù)邊界劃分的,按照業(yè)務(wù)目標(biāo)去構(gòu)建小的系統(tǒng)或產(chǎn)品霉祸,整體系統(tǒng)將會(huì)如下圖所示筑累,即微服務(wù)架構(gòu):
團(tuán)隊(duì)中微服務(wù)的理念應(yīng)是Inter-Operate,而不是Integrate 丝蹭,Inter-Operate是指定義系統(tǒng)邊界和接口慢宗,并為整個(gè)團(tuán)隊(duì)提供完整的堆棧,實(shí)現(xiàn)完全的自制奔穿。如此就能降低系統(tǒng)間的依賴性镜沽,減少通信成本。
康威第四定律
前面提到贱田,人類是復(fù)雜的社會(huì)動(dòng)物缅茉,人與人之間的交流是非常復(fù)雜的,當(dāng)涉及到一個(gè)系統(tǒng)時(shí)男摧,人們經(jīng)常選擇增加人力去減少復(fù)雜性蔬墩,對(duì)于企業(yè)來說,該如何處理這樣的溝通問題耗拓?答案是:分而治之拇颅。
看看公司內(nèi),一名經(jīng)理管理的員工一般少于15個(gè)帆离,二三線經(jīng)理管理的員工要更少,因此结澄,大企業(yè)通常會(huì)將團(tuán)隊(duì)拆成一個(gè)個(gè)小團(tuán)隊(duì)或部門減少溝通成本及管理的問題哥谷,有一些需要考慮的場景:
創(chuàng)業(yè)的項(xiàng)目很好,拿到一大筆風(fēng)投麻献,再招募更多的程序員
人員太多们妥,需要找?guī)讉€(gè)經(jīng)理進(jìn)行管理
康威定律好告訴我們,可以從系統(tǒng)設(shè)計(jì)中看出組織通信的模式勉吻,每個(gè)經(jīng)理要對(duì)大系統(tǒng)的某一小部分負(fù)責(zé)监婶,通過這種方式,它們和更大的系統(tǒng)間溝通有了便捷,因此大的系統(tǒng)也會(huì)被拆分成一個(gè)個(gè)小系統(tǒng)惑惶。(微服務(wù)可以更好地服務(wù)于此)煮盼。
康威定律與微服務(wù)
再來看一下康威定律是如何在半個(gè)世紀(jì)前就奠定了微服務(wù)理論基礎(chǔ)的。
人與人之間的交流很復(fù)雜带污,每個(gè)人的精力是有限的僵控,因此當(dāng)問題很復(fù)雜,需要協(xié)調(diào)地去解決時(shí)鱼冀,需要將組織劃分進(jìn)而提高溝通效率报破。
團(tuán)隊(duì)成員工作的系統(tǒng)設(shè)計(jì)依賴于成員之間的溝通,管理人員可以調(diào)整劃分模式千绪,實(shí)現(xiàn)團(tuán)隊(duì)之間的不同溝通方式充易,這也會(huì)影響系統(tǒng)的設(shè)計(jì)。
如果子系統(tǒng)有清晰的外部通信便捷荸型,那么就可以有效地降低通信成本盹靴,響應(yīng)地設(shè)計(jì)將更加適合和有效。
需要不斷優(yōu)化一個(gè)復(fù)雜的系統(tǒng)帆疟,并容錯(cuò)性和故障恢復(fù)率的幫助下進(jìn)行優(yōu)化鹉究,不要期望大而全面的設(shè)計(jì)或架構(gòu),因?yàn)樗鼈兊拈_發(fā)以迭代的方式發(fā)生踪宠。
以下是一些具體的實(shí)踐建議:
利用一切手段提高通信效率自赔,如Slack、Github和Wiki柳琢,且只與相關(guān)人員進(jìn)行溝通绍妨,每個(gè)人和每個(gè)系統(tǒng)必須有明確的職責(zé),在遇到問題時(shí)柬脸,知道該找誰去解決他去。
在MVP模式下設(shè)計(jì)一套系統(tǒng),以迭代的方式優(yōu)化及驗(yàn)證倒堕,并確保系統(tǒng)的彈性灾测。
采用與系統(tǒng)設(shè)計(jì)相一致的團(tuán)隊(duì),以扁平化和以業(yè)務(wù)為基準(zhǔn)的方式去簡化團(tuán)隊(duì)垦巴,每個(gè)小團(tuán)隊(duì)之間必須有對(duì)應(yīng)負(fù)責(zé)的模塊媳搪,避免模糊的界限,以免在發(fā)生問題時(shí)互相推卸責(zé)任骤宣。
要做小而美的團(tuán)隊(duì)秦爆,人員數(shù)量的增加會(huì)降低效率以及加大成本,亞馬遜CEO Jeff Bezos有個(gè)一個(gè)經(jīng)驗(yàn)法則:如果兩個(gè)披薩對(duì)于一個(gè)團(tuán)隊(duì)來說不夠憔披,那么這個(gè)團(tuán)隊(duì)就太大了等限。一般來說爸吮,一家互聯(lián)網(wǎng)公司的產(chǎn)品團(tuán)隊(duì)由7到8個(gè)人組成(包括前端和后端測試、交互和用戶體驗(yàn)師望门,一些人可能身兼數(shù)職)形娇。
在查看以下微服務(wù)標(biāo)準(zhǔn)時(shí),我們可以很容易地看到微服務(wù)與康威定律之間的密切關(guān)系:
- 由分布式服務(wù)組成的系統(tǒng)
- 企業(yè)部門的業(yè)務(wù)線
- 開發(fā)優(yōu)秀的產(chǎn)品
- Smart endpoints and dumb pipes
- DevOps
- 容錯(cuò)
- 快速發(fā)展