放棄微服務,改用宏服務,Uber 這波什麼操作?

2020-11-30 騰訊網

作者丨田曉旭

Uber 支付體驗平臺放棄了微服務,轉而使用了宏服務,這一消息在網友中引起了熱議。一向是微服務積極分子的 Uber 為什麼突然改用宏服務了?以「簡單」著稱的微服務為什麼又變得難以維護了呢?

1 Uber 支付團隊放棄微服務,轉用宏服務

4 月 6 日,Uber 支付體驗平臺的工程經理 Gergely Orosz 發布推文表示其團隊的架構方向已經發生了變化,放棄微服務,轉而使用宏服務。

為什麼會做出這樣的選擇呢?Gergely Orosz 表示:「最早,Uber 通過構建微服務來完成很小的需求或功能,以至於出現了很多由一個人構建維護的微服務。這些微服務的存在給我們帶來了新的複雜性和挑戰,例如監控、測試、持續集成 / 持續交付(CI/CD)、服務級別協議(SLA)、跨所有微服務的庫版本(安全和時區問題)等等。」

因此,在創建新平臺的時候,Uber 支付體驗團隊對新服務進行了更加深思熟慮的規劃:不再只是完成一件事,而是使其服務於一項業務功能,由 5-10 個工程師負責維護。Gergely Orosz 把這樣的服務規劃稱之為宏服務。

為什麼一向以簡單著稱的微服務,在 Uber 的實踐中突然就變得難以維護了呢?我們先來看一下微服務到底「微」的是什麼呢?

2 微服務到底「微」的是什麼?

微服務是什麼?百度百科給出的解釋是:「微服務是一個新興的軟體架構,就是把一個大型的單個應用程式和服務拆分為數十個的支持微服務。」其中,最關鍵的部分是開發者要能夠對服務中的某些部分進行衡量,並將其對應價值控制在最低水平。

那麼,微服務到底「微」的是什麼?

微團隊微服務首先「微」的就是服務開發團隊的規模,而且它有一個很特別的衡量單位——「披薩」。亞馬遜 CEO Jeff Bezos 提出了著名的兩個披薩原則,即每一個內部團隊的規模必須足夠小,小到兩個披薩餅就可以餵飽整個團隊。

兩個披薩團隊真的有效嗎?有人認可,但也有人質疑,有網友曾吐槽:「這種說法一看就很假,我手下有不少只需要一個披薩的團隊,但他們做出來的東西仍然是一團亂麻。」

微代碼庫

微服務,「微」的也可能是代碼庫,有人甚至會將「微代碼庫」這個概念發揮到極致,限制某項服務中所包含的代碼行數。

代碼庫小當然有好處,代碼庫越小,對應的業務範圍就越小,越易於理解、實施和開發,同時引發大失誤的概率低,而且出現失誤時,重構的難度也更低。

但是大家真的認可代碼庫這種硬性指標嗎?如果認可的話,那麼我們把範圍縮小到每行代碼包含多少個字符,豈不是更好?

我們可以通過很多種方式來定義服務邊界,代碼庫大小絕對是其中最低效的一種。—— Nick Tune

「微系統」

事實上,微團隊和微代碼庫都是「微服務」的理想化產物,大家似乎忘記了系統才是最關鍵的部分,系統是服務的容身之所。

我們真正需要構建的是系統,而不是一組服務。我們使用微服務的目的在於優化系統設計,而不是單純設計一個個獨立服務。事實上,我們很難使用真正獨立的組件建立起龐大的系統,因為這在本質上違背了「系統」的核心定義:

一組相互聯繫的事物或設備,它們能夠共同運作;

一組共同用於特定目標的計算機設備及程序;

彼此交互的服務才能建立起系統,如果只優化系統中的服務,而忽略服務間的交互,就會出現下圖的情況:

「微服務」本身可能非常簡單,但是交互建立起的系統將成為新的複雜性瓶頸。

3 從系統的角度來看服務的複雜性

系統複雜性並不是現在才有的問題,四十年前,沒有雲計算,沒有全球規模需求,也不需要 11.7 秒部署一次系統,但是工程師們仍然是需要克服系統中的複雜性挑戰,現在我們使用的工具雖然不同,但是面對的挑戰仍然存在。

Glenford J. Myers 寫過一本名為《複合 / 結構化設計(Composite/Structured Design)》的書,來講述如何構建面向過程代碼以降低系統複雜性。

除了嘗試直接降低系統中各個部分的局部複雜性之外,我們還可以通過多種方式來解決複雜性難題。複雜性中最重要的是全局複雜性,即系統整體結構的複雜性,程序主要部分之間的關聯或相互依賴程度。

通常,我們可以把局部複雜性理解為單一微服務的複雜性,由服務實現方式決定,而全局複雜性指的是系統整體複雜性,由服務間的交互和依賴關係決定。

一定程度上,這兩種複雜性是「互斥」的。如果想要使全局複雜性最低,那麼消除系統組件間的一切交互,在同一單體服務內實現所有功能即可,但是這會使得整個系統都特別擰巴,甚至可能會使得局部複雜性變得無法管理。而如果只優化局部複雜性,那麼這些代碼又會構成一個個新的複雜「單體」。所以,大規模分布式系統中,必須在全局和局部複雜性之間找到平衡。

4 宏服務是解決服務複雜性的「特效藥」嗎?

到底什麼是宏服務呢?相信國內開發者對這個概念會比較陌生,筆者在翻閱中文資料時,幾乎沒有見到關於宏服務的介紹文章,因此我們去諮詢了多位領域內的技術專家,有專家表示之前沒有聽過「宏服務」這個概念,有兩位專家表示:「宏服務應該是單體和微服務的折衷,關鍵區別是拆分粒度」。不過,也有專家吐槽:「宏服務這個概念沒啥亮點,畢竟沒人規定微服務應該拆多細。」

而在翻閱的英文資料中,有人是這麼描述宏服務的:

宏服務應該定義為運行 2-20 個單獨服務的應用程式體系結構,每個服務代表一個中等大小的代碼庫,可處理業務中定義明確的部分。宏服務的關鍵是拆分服務,最大程度地從拆分中獲得收益,同時最大程度地降低運行多個服務的開銷。

從概念描述中,宏服務似乎是在全局和局部複雜性之間找到了平衡,但理想豐滿、現實骨感,實際應用中,宏服務的實現也並非易事,大多數企業也都在嘗試階段。以 Uber 為例,目前企業內的微服務數量超過 4000,且數量還在不斷增加,而在實踐宏服務的只有一個技術團隊。

事實上,宏服務並非是比微服務更優的架構,只是架構演進中的不同選擇。如果想要解決複雜性問題,無論是微服務,還是宏服務,都應該思考以下幾個問題:

特定服務當中,面向業務與面向集成的端點各佔多大比例?

在服務當中,是否存在與業務不相關的端點?能否在不引入面向集成端點的前提下,將其拆分為兩項或者更多服務?

合併某兩項服務,是否能夠消除之前用於集成二者而添加的端點?

參考閱讀:

https://vladikk.com/2020/04/09/untangling-microservices/

http://highscalability.com/blog/2020/4/8/one-team-at-uber-is-moving-from-microservices-to-macroservic.html

https://mattsencenbaugh.com/macroservices-pragmatic-approach/

InfoQ 讀者交流群上線啦!各位小夥伴可以掃描下方二維碼,添加 InfoQ 小助手,回復關鍵字「進群」申請入群。大家可以和 InfoQ 讀者一起暢所欲言,和編輯們零距離接觸,超值的技術禮包等你領取,還有超值活動等你參加,快來加入我們吧!

點個在看少個 bug

相關焦點

  • 微服務這麼流行,你理解嘛?
    在前一段時間,我們實驗室的項目開始變得越來越麻煩,代碼也越來越臃腫,一個人兼顧前後端的全棧開發,實在是力不從心,沒有一點點幸福感,於是迫切的想要解放生產力,放飛自我,因此開始決定重構項目,改用之前學習過但是一直沒用過的微服務架構。這篇文章將從以下幾個角度來學習Springcloud入門的一些相關知識。1、微服務是什麼?
  • 2021升級版微服務教程—為什麼會有微服務?什麼是SpringCloud?
    以上就是分布式的架構5.服務化於是公司進入轟轟烈烈的服務化時代,但是有幾個問題需要被解決,如下image-20200317151634243 每一個模塊都是一個獨立的項目 都可以獨立啟動 這樣的做法 就叫做服務化 模塊變成項目之後我們稱之為服務 首頁模塊---》首頁服務這就是服務化 這就是微服務,微服務是:特殊的分布式架構【服務化
  • 服務網格和API網關在微服務架構中的作用
    服務網格和API網關在微服務架構中的作用 如果您從事微服務,那麼您可能已經多次聽說過這兩個術語。 人們常常在兩者之間感到困惑。 在本文中,我將詳細討論服務網格和API網關,並討論何時使用。
  • 微服務優化之使用gRPC做微服務的內部通信
    gRPC是一個由Google開源的遠程服務調用框架,具有多路復用和雙向流式通信的特性。大家好,在本文中將為大家介紹為什麼我們應該使用gRPC代替RESTful或JSON,來開發微服務內部的通信接口。什麼是gRPC?
  • 什麼是微內核架構設計?
    微內核在作業系統內核的設計中又有什麼作用?本文從插件化(Plug-in)架構的角度來詮釋微內核架構設計,通過微內核架構和微服務架構的對比,分享其對微服務設計的參考意義。文末福利:技術公開課《微服務實戰:Service Mesh與Istio》。
  • 基於容器雲的微服務架構實踐
    【編者按】微服務架構的誕生和容器技術的流行,幾乎是同時發生的,這並非偶然,而是網際網路時代倒逼傳統技術和架構而產生的變革,而以Docker為代表的容器技術則為微服務理念提供了匹配的實現機制,本文作者從什麼是微服務切入,詳細的介紹了微服務架構的優勢,最後從自身實踐出發,給出了微服務架構的雲端實踐。
  • 微服務拆分到什麼粒度合適——康威定律
    微服務這個概念一直很火,現在ServiceMesh概念更火,最近我經手的多個項目也都採用微服務的方式開發。但實踐發現,當一個RD同時開發超過2個微服務的時候,出現bug或故障的概率會提升。我現在看項目的時候會不自覺的關注工程服務拆分個數和研發人數的比值。雖然這麼做,我卻說不出來個所以然,也沒有找到一個理論依據。
  • 海底撈「變態」服務升級,忍了小熊和陪打遊戲,卻不能忍這波操作
    ,忍了小熊和免費拖鞋,卻不能忍這波操作!,所以海底撈的生意是越來越火爆了,適當的服務會讓人感到舒暢,但是過分的貼心和熱情會讓人難以接受,所以最近就出現了這樣的話題:海底撈「變態」服務升級,忍了小熊和免費拖鞋,卻不能忍這波操作!
  • 微服務架構技術棧
    下圖是我近期工作總結和參考的一個微服務技術體系,我想同時分享給一線架構師或者工程師參考,其中粉紅色標註的模塊是和微服務關係最密切的模塊,大家在做技術選型時,可以同時對照這個體系。.四、服務框架選型服務框架是一個比較成熟的領域,有太多可選項。
  • 什麼是宏?什麼是過程?
    今天和大家分享一下比較有深度的理論知識:宏和過程。其實在寫代碼和操作EXCEL時很多的時候會有意無意的說出兩句話「宏命令」,「過程函數」。那麼這是怎麼回事呢?宏又怎麼稱之為宏命令呢?過程又怎麼能稱之為函數呢?
  • 無服務和微服務架構,誰是業務計算的未來?
    無伺服器和微服務模型的區別?總的說來,這兩種架構的相似之處在於:它們都能夠最大程度地降低運營的成本,縮短應用部署的周期,滿足不斷變化的開發需求,以及優化那些對於時間和資源敏感的日常任務。那麼,微服務和無伺服器模型之間的不同之處在哪裡呢?
  • 「首席架構師看微服務架構」介紹NGINX的微服務參考架構
    我們還認識到,實現微服務有許多不同的方法,其中許多方法都是新穎的,並且特定於各個開發團隊的需求。我們認為需要使用模型來使公司更容易開發和交付自己的基於微服務的應用程式。考慮到這一切,NGINX專業服務部門正在開發NGINX微服務參考架構(MRA) - 一組可用於創建自己的微服務應用程式的模型。
  • DDD到底適不適合微服務架構?
    從初期的單體架構,到豎井式架構、RPC架構,再到大放異彩的微服務架構,可以說架構演進,本質上就是基於業務,對現有架構的抽象過程。一名架構師,最怕缺少全局意識和長線思維。如果架構師設計架構的出發點,只是緩解燃眉之急,那麼在未來,這套系統的迭代會越來越困難,很可能陷入推翻、重建,再推翻、再重建的「鬼打牆」。
  • 微服務RPC框架選美
    主持人: Xml 配置是用 xml 文件來配置協議 、 服務 、 註冊中心等信息 ,這是 rpc 框架最常用的配置方式,也是最基本的配置方式; 屬性配置 是 用 properties 文件來配置協議 、 服務 、 註冊中心等信息 , 和Xml 配置使用上異曲同工 ; 注釋配置是聲明 Annotation 用來指定需要解析的包名 , 使用 spring-boot
  • 解鎖物聯網奧秘、探秘微服務引擎,DevRun開發者沙龍深度賦能廣州...
    微服務又將能為企業帶來什麼?今天華為雲技術專家們為我們帶來了答案。  9月5日,DevRun開發者沙龍—華為雲廣州專場成功舉辦。她從如何使用微服務來實踐業務的有效管理,微服務理念為業務拓展提供了哪些技術能力以及微服務適用於哪些場景等維度切入,為開發者們帶來了詳細的解答。  她首先回顧了微服務的架構演進進程,指出微服務是當前和未來的主流架構,帶來的核心價值是縮短業務的上線周期和保障業務運行的高可靠性。但微服務化也帶來了四大挑戰,包括如何基於微服務框架高效開發和上線?在不可預期的流量下如何保證業務高可靠運行?
  • 20道你必須要背會的微服務面試題,面試一定會被問到
    4、請談談對SpringBoot 和SpringCloud的理解5、分布式系統面臨的問題6、什麼是服務熔斷,什麼是服務降級7、微服務的優缺點分別是什麼?說下你在項目開發中碰到的坑?8、你所知道的微服務技術棧有哪些?請列舉一二9、什麼是 Eureka服務註冊與發現10、Eureka的基本架構是什麼?11、作為服務註冊中心,Eureka比Zookeeper好在哪裡?
  • 微服務,Java目前很火熱的系統架構
    而現在,有打車服務了,我們若是要乘車直接叫滴滴就好了,而司機也方便找乘客。對於服務也是一樣的,以前有什麼問題? 服務越來越多,要管理每個服務的地址。 服務之間調用關係錯綜複雜,難以理清。 服務過多,服務狀態難以管理。
  • 宏是什麼? 《天諭》技能宏功能介紹
    宏是什麼?,但是數量繁多的技能在帶來動感操作的同時,也讓不少手殘黨苦不堪言,尤其是在高強度副本和一些PVE玩法中,手速和反應不過關的玩家,往往會有一種手足無措的感覺,不過這一切都將隨著官方宏技能專區的上線而成為歷史。
  • 老闆要搞微服務,只能硬著頭皮上了...
    如果你正準備做微服務轉型,或者在微服務化過程中遇到了困難。此文很可能會幫到你!正文開始前,為了讓各位讀友更好的理解本文內容,先花兩分鐘了解一下微服務的優缺點。聊起微服務,很多朋友都了解微服務帶來的好處,羅列幾點: 模塊化,降低耦合。將單體應用按業務模塊拆分成多個服務,如果某個功能需要改動,大多數情況,我們只需要弄清楚並改動對應的服務即可。
  • 中小團隊開始回歸單體架構,那麼電信運營商該不該用微服務?
    2 二、 微服務並不是萬能的 微服務也有其弊端和痛點,由於存在大量小服務以及複雜的服務交互關係,運行的核心變成服務治理,需要重度依賴微服務框架。 1. 微服務應用後產生的新問題