關於微服務的介紹,能夠參考微服務那點事。html
微服務是最近很是火熱的新概念,你們都在追,也都以爲很對,可是彷佛沒有很充足的理論基礎說明這是正確的,給人的感受是 不明覺厲 。前段時間看了Mike Amundsen 《遠距離條件下的康威定律——分佈式世界中實現團隊構建》(是Design RESTful API的做者)在InfoQ上的一個分享,以爲頗有幫助,結合本身的一些思考,整理了該演講的內容。前端
可能出乎不少人意料以外的一個事實是,微服務不少核心理念其實在半個世紀前的一篇文章中就被闡述過了,並且這篇文章中的不少論點在軟件開發飛速發展的這半個世紀中居然一再被驗證,這就是康威定律(Conway's Law)。git
在康威的這篇文章中,最有名的一句話就是:程序員
Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations. - Melvin Conway(1967)github
中文直譯大概的意思就是:設計系統的組織,其產生的設計等同於組織以內、組織之間的溝通結構。看看下面的圖片(來源於互聯網,侵刪),再想一想Apple的產品、微軟的產品設計,就能形象生動的理解這句話。算法
用通俗的說法就是:組織形式等同系統設計。編程
這裏的系統按原做者的意思並不侷限於軟件系統。聽說這篇文章最初投的哈佛商業評論,結果程序員屌絲的文章不入商業人士的法眼,無情被拒,康威就投到了一個編程相關的雜誌,因此被誤解爲是針對軟件開發的。最初這篇文章顯然不敢自稱定律(law),只是描述了做者本身的發現和總結。後來,在Brooks Law著名的人月神話中,引用這個論點,並將其「吹捧」成了如今咱們熟知「康威定律」。後端
Mike從他的角度概括這篇論文中的其餘一些核心觀點,以下:安全
組織的溝通和系統設計之間的緊密聯繫,在不少別的領域有相似的闡述。對於複雜的系統,聊設計就離不開聊人與人的溝通,解決好人與人的溝通問題,纔能有一個好的系統設計。相信幾乎每一個程序員都讀過的《人月神話》(1975年,感受都是老古董了,經典的就是經得起時間考驗)裏面許多觀點都和這句話有殊途同歸之妙。架構
好比《人月神話》中最著名的一句話就是
Adding manpower to a late software project makes it later --Fred Brooks, (1975)
Boss們都聽到了嗎?爲了趕進度加程序員就像用水去滅油鍋裏的火同樣(無奈你們仍是前赴後繼)。
爲何?人月神話也給出了很簡潔的答案:溝通成本 = n(n-1)/2,溝通成本隨着項目或者組織的人員增長呈指數級增加。是的,項目管理這個算法的複雜度是O(n^2)。舉個例子
因此知道爲何互聯網創業公司都這麼小了吧,必須小啊,否則等CEO和全部人講一遍創業的想法後,風投的錢都燒完了。
Mike還舉了一個很是有意思的理論,叫「Dunbar Number」,這是一個叫Dunbar(廢話)生物學家在1992年最先提出來的。最初,他發現靈長類的大腦容量和其對應的族羣大小有必定關聯,進而推斷出人類的大腦能維繫的關係的一些有趣估計。舉例來講
是否是和上面的溝通成本的數字很貌似有關聯?是的,咱們的大腦智力只能支持咱們維繫這麼多的關係。(你們都知道這不是程序猿擅長的領域,在開發團隊裏,這個值應該更小,估計和猿差很少 -_-凸 )
溝通的問題,會帶來系統設計的問題,進而影響整個系統的開發效率和最終產品結果。
Eric Hollnagel是敏捷開發社區的泰斗之一,在他《Efficiency-Effectiveness Trade Offs》 一書中解釋了相似的論點。
Problem too complicated? Ignore details.
Not enough resources?Give up features.
--Eric Hollnagel (2009)
系統越作越複雜,功能愈來愈多,外部市場的競爭愈來愈劇烈,投資人的期待愈來愈高。但人的智力是有上限的,即便再牛逼的人,融到錢再多也不必定招到足夠多合適的人。對於一個巨複雜的系統,咱們永遠沒法考慮周全。Eric認爲,這個時候最好的解決辦法居然是——「破罐子破摔」。
其實咱們在平常開發中也常常碰到。產品經理的需求太複雜了?適當忽略一些細節,先抓主線。產品經理的需求太多了?放棄一些功能。
聽說Eric被一家航空公司請去作安全諮詢顧問,複雜保證飛機飛行系統的穩定性和安全性。Eric認爲作到安全有兩種方式:
對於飛機這樣的複雜系統,再牛逼的人也沒法考慮到漏洞的方方面面,因此Eric建議放棄打造完美系統的想法,而是經過不斷的試飛,發現問題,確保問題發生時,系統能自動復原便可,而不追求飛行系統的絕對正確和安全。
下面的圖很好的解釋了這個過程:
聽着很耳熟不是嗎?這不就是 持續集成 和敏捷開發嗎?的確就是。
另外一方面,這和互聯網公司維護的分佈式系統的彈性設計也是一個道理。對於一個分佈式系統,咱們幾乎永遠不可能找到並修復全部的bug,單元測試覆蓋1000%也沒有用,錯誤流淌在分佈式系統的血液裏。解決方法不是消滅這些問題,而是容忍這些問題,在問題發生時,能自動回覆,微服務組成的系統,每個微服務均可能掛掉,這是常態,咱們只有有足夠的冗餘和備份便可。即所謂的 彈性設計(Resilience) 或者叫高可用設計(High Availability)。
這是康威第必定律組織和設計間內在關係的一個具體應用。更直白的說,你想要什麼樣的系統,就搭建什麼樣的團隊。若是你的團隊分紅前端團隊,Java後臺開發團隊,DBA團隊,運維團隊,你的系統就會長成下面的樣子:
相反,若是你的系統是按照業務邊界劃分的,你們按照一個業務目標去把本身的模塊作出小系統,小產品的話,你的大系統就會長成下面的樣子,即微服務的架構
微服務的理念團隊間應該是 inter-operate, not integrate 。inter-operate是定義好系統的邊界和接口,在一個團隊內全棧,讓團隊自治,緣由就是由於若是團隊按照這樣的方式組建,將溝通的成本維持在系統內部,每一個子系統就會更加內聚,彼此的依賴耦合能變弱,跨系統的溝通成本也就能下降。
前面說了,人是複雜的社會動物,人與人的經過很是複雜。可是當咱們面對複雜系統時,又每每只能經過增長人力來解決。這時,咱們的組織通常是如何解決這個溝通問題的呢?Divide and conquer,分而治之。你們看看本身的公司的組織,是否是一個一線經理通常都是管理15我的如下的?二線經理再管理更少的一線?三線再管理更少的,以此類推。(這裏徹底沒有暗示開發經理比程序猿更難管理)
因此,一個大的組織由於溝通成本/管理問題,總爲被拆分紅一個個小團隊。
瞭解了康威定律是什麼,再來看看他如何在半個世紀前就奠基了微服務架構的理論基礎。
帶來的具體的實踐建議是:
再對應下衡量微服務的標準,咱們很容易會發現他們之間的密切關係: