微服務拆分到什麼粒度合適——康威定律

2021-01-10 普通程式設計師

微服務這個概念一直很火,現在ServiceMesh概念更火,最近我經手的多個項目也都採用微服務的方式開發。但實踐發現,當一個RD同時開發超過2個微服務的時候,出現bug或故障的概率會提升。

我現在看項目的時候會不自覺的關注工程服務拆分個數和研發人數的比值。雖然這麼做,我卻說不出來個所以然,也沒有找到一個理論依據。

一、引子

最近讀到Spring Cloud Alibaba成員姬望(彭文杰)的一篇採訪稿,解開了我的一些疑惑。原文在微信公眾號裡文章裡搜索《Spring Cloud Alibaba,中國 Javaer 的福音,為微服務續上 18 年

我摘錄了比較關鍵的一段

微服務解決的本質問題是團隊分工

SOA 也好、微服務也好,解決的根本問題是團隊分工問題,詳見康威定律,這是大型軟體發展的必然,不因為人的喜好而改變。當你讀懂康威定律,就會發現「服務拆分粒度難以準確把握」根本不是本質問題。你有幾個 2 pizza 團隊,最好就拆成幾個微服務。舉一個現實的例子:只有一個開發人員時,儘量就做單體應用,不要沒事找刺激拆成 10 個微服務,最終這個開發人員還會把他合成一個。微服務要求縱向的 2 pizza 團隊(無數個小團隊,包含開發、測試、運維),當然我們也實施過一些傳統大型企業,但團隊還是處在橫向結構的場景下(開發、運維、測試各是一個團隊),拆分微服務讓他們很痛苦,尤其是運維團隊。

這段話裡有兩個概念 2 pizza團隊 和 康威定律

2 pizza團隊

兩個披薩原則是指與會人數不能多到兩個披薩餅還不夠他們吃的地步。亞馬遜CEO傑夫·貝索斯(JeffBezos)認為事實並非公司開會參與人數越多越好,他認為人數越多的會議將不利於決策的形成,而是會導致與會人員的人云亦云,稱之為兩個披薩原則。2 pizza團隊可以簡單理解為甘某件事情的小團隊。

康威定律

出乎很多人意料,微服務很多核心理念在半個世紀前(1968年)的《How Do Committees Invent?》一文中就被闡述過了,這篇文章中的很多論點在軟體開發飛速發展的這半個世紀中竟然一再被驗證,這就是康威定律(Conway's Law)

有意思的是該論點在提出多年內一直默默無名,後來在Brooks Law著名的人月神話中引用這個論點,「康威定律」 從此進入大眾的視野。

二、康威定律

wikipedia顯示,康威定律最著名的一句話這這樣的

「organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.」

大致的意思是:系統設計(產品結構)等同組織形式,每個設計系統的組織,其產生的設計等同於組織之間的溝通結構(簡單點說就是,系統的設計受限於設計系統的組織的人員架構形式。我們也經常說微服務不光是一個技術問題,更是一個研發組織問題)

想一想你用過的產品,看一看下邊這張圖,也許能加深對康威定律的理解

Mike Amundsen (Design RESTful API的作者),在《遠距離條件下的康威定律——分布式世界中實現團隊構建》的一次技術分享中,從他的角度歸納這篇論文(《How Do Committees Invent?》)中的其他一些核心觀點

1、Communication dictates design(組織溝通方式會通過系統設計表達出來)

2、There is never enough time to do something right, but there is always enough time to do it over(時間再多一件事情也不可能做的完美,但總有時間做完一件事情)

3、There is a homomorphism from the linear graph of a system to the linear graph of its design organization(線性系統和線性組織架構間有潛在的異質同態特性)

4、The structures of large systems tend to disintegrate during development, qualitatively more so than with small systems(大的系統組織總是比小系統更傾向於分解)

Mike Amundsen的更多細節不展開了,感興趣可以自行搜索。

三、支持康威定律的證據

wikipedia在康威定律條目的Supporting evidence章節有如下描述。

麻省理工學院和哈佛商學院研究小組發表了支持康威定律的證據,他們使用「鏡像假設」作為康威定律的等效術語,發現「支持鏡像假設」的有力證據,「[產品]模塊化的顯著差異」與「分布式團隊傾向於開發更多模塊化產品的觀點一致」。

馬裡蘭大學的Nagappan、Murphy和Basili與微軟合作,以及芬蘭坦佩雷理工大學的Syeed和Hammouda的案例研究,同樣支持康威定律。

四、康威定律如何解釋微服務的合理性

了解了康威定律是什麼,再來看看他如何在半個世紀前就奠定了微服務架構的理論基礎。

人與人的溝通是非常複雜的,一個人的溝通精力是有限的,所以當問題太複雜需要很多人解決的時候,我們需要做拆分組織來達成對溝通效率的管理組織內人與人的溝通方式決定了他們參與的系統設計,管理者可以通過不同的拆分方式帶來不同的團隊間溝通方式,從而影響系統設計如果子系統是內聚的,和外部的溝通邊界是明確的,能降低溝通成本,對應的設計也會更合理高效複雜的系統需要通過容錯彈性的方式持續優化,不要指望一個大而全的設計或架構,好的架構和設計都是慢慢迭代出來的帶來的具體的實踐建議是

我們要用一切手段提升溝通效率,比如slack,github,wiki。能2個人講清楚的事情,就不要拉更多人,每個人每個系統都有明確的分工,出了問題知道馬上找誰,避免踢皮球的問題。通過MVP的方式來設計系統,通過不斷的迭代來驗證優化,系統應該是彈性設計的。你想要什麼樣的系統設計,就架構什麼樣的團隊,能扁平化就扁平化。最好按業務來劃分團隊,這樣能讓團隊自然的自治內聚,明確的業務邊界會減少和外部的溝通成本,每個小團隊都對自己的模塊的整個生命周期負責,沒有邊界不清,沒有無效的扯皮,inter-operate, not integrate。做小而美的團隊,人多會帶來溝通的成本,讓效率下降。亞馬遜的Bezos有個逗趣的比喻,如果2個披薩不夠一個團隊吃的,那麼這個團隊就太大了。事實上一般一個網際網路公司小產品的團隊差不多就是7,8人左右。公司級的組織結構設置看起來層次很高,回到最初的問題,你的小團隊微服務到底拆分多少合適呢?

《How Do Committees Invent?》文中提到任務的拆解可以嵌套進行,意思是先按照大力度拆,拆分出的部分繼續按照更細的粒度拆分,直到不需要拆分為止。

結合阿里姬望和我個人的經驗。如果你還是新手,那麼你預期項目有幾個人開發就拆成幾個部分一般不會有大的問題;如果你比較有經驗,可以結合公司微服務的治理能力靈活發揮。

總之,只要說得清楚,運維能力又能跟上,一般就是合理的!

相關焦點

  • 放棄微服務,改用宏服務,Uber 這波什麼操作?
    為什麼一向以簡單著稱的微服務,在 Uber 的實踐中突然就變得難以維護了呢?我們先來看一下微服務到底「微」的是什麼呢? 2 微服務到底「微」的是什麼? 微服務是什麼?百度百科給出的解釋是:「微服務是一個新興的軟體架構,就是把一個大型的單個應用程式和服務拆分為數十個的支持微服務。」
  • 2021升級版微服務教程—為什麼會有微服務?什麼是SpringCloud?
    2021升級版SpringCloud教程從入門到實戰精通「H版&alibaba&鏈路追蹤&日誌&事務&鎖」教程全目錄「含視頻」:https://gitee.com/bingqilinpeishenme/Java-Wiki微服務基本概念架構的演變為什麼會有微服務?
  • 微服務,Java目前很火熱的系統架構
    一、系統架構概述技術更新是非常快的,從單一應用到垂直細分,到分布式,到SOA,以及微服務架構。還有在Google帶領下的Service Mesh,只有不斷地學習才能在IT行業前行下去。1集中式架構當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
  • 微服務這麼流行,你理解嘛?
    2、微服務和微服務架構的區別是什麼?3、微服務技術有什麼?4、微服務的優缺點是什麼?5、為什麼選擇Springcloud作為微服務架構?什麼技術呢?就是我們今天所說的微服務架構。二、什麼是微服務由於業界還沒有對微服務的概念有一個統一的解釋,但是你可以這樣去理解,微服務其實就是一種思想,這個思想是:考慮如何把一個複雜的項目拆分成一個個獨立的小項目。就好比是電腦中的進程,拆分成一個個小的線程一樣。
  • 生命遊戲——約翰·康威
    他年少時就對數學很有強烈的興趣:四歲時,其母發現他背誦二的次方;十一歲時,升讀中學的面試,被問及他成長後想幹什麼,他回答想在劍橋當數學家。後來康威果然於劍橋大學修讀數學,現時為普林斯頓大學的教授。薛丁格進而總結到:「微型密碼應該對應於一個高度複雜而精準的發育藍圖,並且可能以某種方式包含了使密碼起作用的程序,這一點已經不再難以想像了。」後來,因揭示DNA結構而獲得諾貝爾獎的三位科學家,都聲稱《生命是什麼》在他們通向雙螺旋之路上發揮了重要作用。
  • 20道你必須要背會的微服務面試題,面試一定會被問到
    從技術維度來說:微服務化的核心就是將傳統的一站式應用,根據業務拆分成一個一個的服務,徹底地去耦合,每一個微服務提供單個業務功能的服務,一個服務做一件事,從技術角度看就是一種小而獨立的處理過程,類似進程概念,能夠自行單獨啟動或銷毀,擁有自己獨立的資料庫。2、微服務之間是如何通訊的?
  • 粒度測試的基本方法
    那麼顆粒的沉降速度與粒徑有怎樣的數量關係,通過什麼方式反映顆粒的沉降速度呢?  ①Stokes定律:在重力場中,懸浮在液體中的顆粒受重力、浮力和粘滯阻力的作用將發生運動,其運動方程為:  這就是Stokes定律。  從Stokes定律中我們看到,沉降速度與顆粒直徑的平方成正比。
  • 約翰·康威:生命遊戲發明者的生命遊戲
    2020年4月11日,普林斯頓大學榮譽退休教授、計算機科學家和數學家約翰·霍頓·康威(John Horton Conway)因新冠病毒引起的併發症在新澤西普林斯頓去世,終年82
  • 什麼才是真正的架構設計?
    什麼是架構和架構本質在軟體行業,對於什麼是架構,都有很多的爭論,每個人都有自己的理解。此君說的架構和彼君理解的架構未必是一回事。因此我們在討論架構之前,我們先討論架構的概念定義,概念是人認識這個世界的基礎,並用來溝通的手段,如果對架構概念理解不一樣,那溝通起來自然不順暢。
  • 粒度測試知識匯總
    ③ 函數法:用數學函數表示粒度分布的方法。這種方法一般在理論研究時用。如著名的Rosin-Rammler分布就是函數分布。6、粒徑和等效粒徑:粒徑就是顆粒直徑。這概念是很簡單明確的,那麼什麼是等效粒徑呢,粒徑和等效粒徑有什麼關係呢?
  • 逝者 | 約翰·康威:生命遊戲發明者的生命遊戲
    2020年4月11日,普林斯頓大學榮譽退休教授、計算機科學家和數學家約翰·霍頓·康威(John Horton Conway)因新冠病毒引起的併發症在新澤西普林斯頓去世
  • 新冠肺炎殺死了一個偉大的數學家-生命遊戲之父、約翰·康威因新冠...
    生命遊戲之外,康威的主要研究領域是數學。他們證明在某些條件下,如果實驗者可以自由決定在實驗中測量什麼量,那麼基本粒子必須能夠自由選擇其自旋,使得測量結果與物理定律一致。康威的看法是,如果實驗者有自由意志,那麼基本粒子也必須有。 康威的自由意志定理是對量子力學不確定性的描述,它否定了徹底的決定論,特別是二元論,拓展了對人類自由意志以及對從微觀到宏觀的認識。
  • 服務網格和API網關在微服務架構中的作用
    服務網格和API網關在微服務架構中的作用 如果您從事微服務,那麼您可能已經多次聽說過這兩個術語。 人們常常在兩者之間感到困惑。 在本文中,我將詳細討論服務網格和API網關,並討論何時使用。
  • 基於容器雲的微服務架構實踐
    【編者按】微服務架構的誕生和容器技術的流行,幾乎是同時發生的,這並非偶然,而是網際網路時代倒逼傳統技術和架構而產生的變革,而以Docker為代表的容器技術則為微服務理念提供了匹配的實現機制,本文作者從什麼是微服務切入,詳細的介紹了微服務架構的優勢,最後從自身實踐出發,給出了微服務架構的雲端實踐。
  • 中臺的進化,從「IT架構」到「數智化能力」
    劉昆鵬為我們講到, 「今年很少人提這個詞了,因為中臺這個詞現在已過了炒作期,如今已沒有什麼爭論、疑問的地方。或者說「中臺化」已經成為企業數智化轉型的必備選擇,至少對於大型企業而言,中臺化架構已經成為業務創新與管理變革的必備能力。  在企業進行中臺化改造時,面臨的不僅是技術架構的變化,也需要配套企業頂層戰略與組織上的變化。
  • 約翰·康威:一個只想過得有趣的數學家
    約翰·康威 | Lifewiki平平無奇的數學小天才1937年,康威出生於英國利物浦。他的媽媽曾提到,她發現康威4歲就能背2的冪方,一直背到1024。不過,康威自己說:「我不記得這事,這可能只是鼓勵孩子的故事。」
  • 基於Prometheus來做微服務監控,有多吃香?
    微服務架構是目前各大網際網路公司普遍採用的軟體架構方式。在微服務架構中,系統被拆分為多個小的、相互獨立的服務,這些服務運行在自己的進程中,可以獨立的開發和部署。
  • SpringCloud微服務架構篇3:Spring Cloud簡介
    服務註冊機制,可以讓服務提供者在上線時將所提供的服務信息註冊到服務治理伺服器中,供服務消費者使用。當服務下線時將自己從服務治理伺服器中註銷,避免服務消費者調用而造成的異常。4、Spring Cloud與微服務容錯、降級微服務容錯、降級旨在為微服務架構提供更大的彈性,通過Hystrix提供的@HystrixCommand註解可以輕鬆為我們所開發的微服務提供容錯、回退、降級等功能。另外,Hystrix也默認集成到Fegin子項目中。
  • 微服務架構技術棧
    ;三是 Pivotal 將 NetflixOSS 開源微服務組件集成到其 Spring 體系,推出 Spring Cloud 微服務開發技術棧。網關將 JWT Token 和請求一起轉發到後臺微服務;JWT 中可以存儲用戶會話信息,該信息可以傳遞給後臺的微服務,也可以在微服務之間傳遞,用作認證授權等用途;每個微服務包含 JWT 客戶端,能夠解密 JWT 並獲取其中的用戶會話信息。
  • 老闆要搞微服務,只能硬著頭皮上了...
    如果你正準備做微服務轉型,或者在微服務化過程中遇到了困難。此文很可能會幫到你!正文開始前,為了讓各位讀友更好的理解本文內容,先花兩分鐘了解一下微服務的優缺點。聊起微服務,很多朋友都了解微服務帶來的好處,羅列幾點: 模塊化,降低耦合。將單體應用按業務模塊拆分成多個服務,如果某個功能需要改動,大多數情況,我們只需要弄清楚並改動對應的服務即可。