主頁 > 軟體設計 > 醒醒!你不是真的需要微服務

醒醒!你不是真的需要微服務

2022-11-06 06:56:08 軟體設計

 

 

2020 年,很多技術人可能都已經迷醉在了微服務的成功故事中,但現實很骨感,微服務也不是“靈丹妙藥”,本文想給現階段“狂熱”的微服務潑潑冷水、降降溫,也許你就會發現,你并不是真的需要微服務,

2020 年,如果再講什么是微服務,已經落伍了,畢竟微服務的成功故事已經開始在業界廣為流傳了,但是你真的需要微服務嗎?

“真的需要微服務嗎?”這個想法已經困擾我很長一段時間了,最近我與多位技術人進行了溝通,也許我們可以從解決一個有趣的問題,開始入手,“什么是微服務?我們的解決方案應該遵循這種架構嗎?”

問題的第一部分很容易回答,而第二部分則需要高屋建瓴、謹慎對待,在溝通之后,我發現有個事情是大家都達成共識的:

  • 受益者會把微服務架構應用到他們即將推出的產品中,因為他們需要立刻出效果來背書,

  • 參與討論的人里有大量的非技術人員,當談話越來越“技識訓”,與決策也就越不相關了,

  • 長時間的中斷以及提不出問題,這也就意味著不熟悉 Web 服務,更不用說微服務了,

我不會因為他們不知道 Web 服務是做什么,或者微服務如何對他們有利或有害而譴責他們,畢竟,他們在我不擅長的作業上要出色得多,他們打算加入微服務的行列,雖然還不甚了解其影響!

我第一次聽到“微服務”這個詞是在 2013 年,當時是在 YouTube 上一個解釋 Netflix 服務架構的視頻中,當時我覺得這讓人無法理解,所以毫不猶豫地跳過了,畢竟,這對于當時想方設法要進入設計原理領域的人來說太難了,但是,當新的專案提案宣布采用微服務時,它很快就讓我著迷了,這個專案的設計很吸引人,它仍然是我接觸過的最好的代碼庫之一,

說實話,模塊化設計的廣泛可能性可以減少負擔,而我只是一個無知的開發人員,對 DevOps 避之唯恐不及,它帶來了額外的復雜性,如果快進 5 年,我可能正在和一群全新的人開發一個全新的產品,我的日子里充斥著由設計糟糕的微服務和業余的 DevOps 戰術所引發的問題,雖然問題很快就解決了,但我看到了微服務的脆弱性,這也讓我根據自己的經驗來審視整個架構,雖然已經太晚了,但晚做總比不做好!

看到了微服務的正反兩面影響,我開始告誡自己要多看看反面影響,在實踐微服務之前,先問自己以下幾個問題,

1應用程式已經大到足以拆分為微服務嗎?

必須承認,并不是所有的應用程式都大到可以分解成更小的服務,顧名思義,微服務是一組更小的、具有特定用途的服務,在理想的情況下,我們希望每個服務本身都是一個完整的應用程式,

這是微服務和單體服務之間“每行代碼成本”的一個比較,由于微服務在人力和計算成本方面的最小資源限制,即使在比較輕量化的形式下,也會產生較高的成本,成本是每個人都關心的問題,如果不是,你可能根本就不該做決定,

當然,你的代碼庫將來會增長,它也可能會增加一個新的領域,但你應該永遠記住:一個設計良好的代碼庫隨時都可以切換到微服務,所以在接近閾值時實踐微服務,是性價比最高的,

2你真的需要擴展應用程式的各個組件嗎?

假設你的產品負責人帶著一個 HRMS 應用程式的想法來找你,想要通過它管理一個上萬人規模的組織,你可能立馬就有了解決方案:微服務架構,

當然,這是一個極端的例子,但是你明白我的意思!!

使用微服務架構的一個主要優點是單個組件非常容易擴展,我們可能會發現大量的應用程式需要組件可以單獨擴展,但是你的應用程式真的需要這樣做嗎?

3你是否有跨服務的事務?

現在,這可能是最困難的戰略選擇之一,跨多個服務的事務是整個架構的負擔,解決跨服務的事務意味著,服務之間的互鎖、一系列難以跟蹤的死鎖以及可能破壞服務健康的競爭條件;有時甚至是工程師的健康,

根據定義,REST 服務是無狀態的,它們不應該參與超出單個服務的事務,在高性能的世界里,兩段提交 [2PC] 是一個不必要的麻煩,而 SAGA 模式只會增加另一層意料之外的復雜性,

微服務引入了最終一致性問題,因為它們堅持分布式的資料管理,在單體架構中,你可以在單個事務中一次更新一堆東西,微服務需要多個資源來更新,不贊成采用分布式事務(理由很充分),所以現在,開發人員需要注意一致性問題,并在寫任何代碼之前,弄清楚如何檢測不同步,

——Martin Fowler

有可能跨服務進行事務處理嗎?

是的,當然,

但是,是否值得在整個無狀態的服務中實作一系列操作呢?

恐怕不行!

4服務之間是否需要頻繁通信?

在傳統的單體服務中,每個微服務實體表現為系統內的模塊,模塊之間的通信在記憶體中,延遲接近于零,微服務的引入意味著,通信已經從記憶體事務變成了網路指令,

有許多可靠的解決方案可供我們選擇,但它們都以延遲為代價,從記憶體事務轉變為基于網路的通信將把延遲單位從納秒變為微秒,假設有三個不同的服務通過網路相互通信,假設每個服務呼叫需要 100 毫秒 [在有負載的情況下這不可能],那么僅在網路上就需要花費 300 毫秒,

有些應用程式生來就與組件和服務緊密集成,在處理實時資料的應用程式中,增加的通信層可能會導致災難性的結果,想象一下,當你穿著外科手術服或者在控制航空交通時,通訊出現了延遲!

5其他值得思考的問題

增加復雜性——當然,復雜性無法量化,只能相對地進行比較,雖然微服務最初的設計目的是通過將應用程式拆分成更小的塊來降低復雜性,但是架構本身在部署和維護方面很復雜,

分布式的成本——微服務是具有分子特性的分布式系統,但分布式也有代價,單體服務將部署在大型 VM 或首選容器上,但是,對于微服務,需要使用多個 VM 或容器(在理想情況下)單獨部署每個服務,當然,它們可能很小,你可以自己算算,請記住,我甚至還沒有討論過服務編排和維護所涉及的成本,

Devops 的采用——取決于你從哪個角度看,這可能有益,也可能有害,DevOps 是一種被廣泛接受的、經過驗證的運營解決方案,但是,如果你屬于一個較小的組織,那么構建一個 DevOps 團隊所造成的傷害可能會多于帶來的進步,但是,有一件事是肯定的,那就是如果沒有專門的 DevOps 團隊,你就無法維護和監控微服務,

緊密集成——有些應用程式天生就是緊耦合的,將它們解耦以“適應”架構將是災難性的,

缺乏經驗——缺乏經驗對于任何問題都至關重要,不僅僅局限于 SOA,但當涉及到微服務時,由于它所持有的抽象定義,它可能會加劇損害,如果你的微服務部署通過部署規則將你推到了次要位置,或者當某個依賴項服務宕機時崩潰,那就太晚了,

端到端測驗——一個典型的單體應用程式讓你可以幾乎同時啟動和運行測驗,而如果沒有可行的編排,那么具有相互依賴關系的多個服務將使測驗延期,

混亂的資料契約——在團隊中制定和使用資料契約與在團隊之間共享資料契約有很大的不同,當你使用微服務時,你的團隊可能不在同一個區域;更不用說他們都使用相同的編程語言,為了特殊需要而制定資料契約需要你付出時間和空間成本,

遺留代碼庫——老實說,對于我們大多數人來說,處理遺留代碼庫是一項日常作業,它是大多陣列織的主要收入來源,日新月異的技術進步讓我們保持領先,與此同時,它也將我們與遺留代碼庫隔離開來,“你確定你剛剛開發的 RabbitMQ 框架適合于托管在 IBM AIX 服務器上的遺留應用程式嗎?”

除錯缺陷——每個服務都有自己的一組日志檔案要查看,更多的服務等于更多的日志檔案,

6小結

我是來告訴你“不要使用微服務”的嗎?

絕對不是!

事實上,微服務一直以來都有不太好的名聲,但它們解決了我們都認為無法解決的問題,Netflix 公司采用微服務的故事啟發了許多人,而且,這個名單并不僅僅局限于 Netflix,Uber、SoundCloud 和巨頭亞馬遜都是我們可以立馬找到的微服務實踐案例,而且,成功的故事不僅限于消費者應用程式,我曾與美國醫療保健巨頭合作過,我每次看到他們的原始碼,都會被其設計深深吸引,

如果你 5 年前就跟風了微服務,我不會譴責你的輕信,時代不同了,我們現在所能做的就是誠實地面對它,現在是 2020 年了,我們受的傷已經夠多了,周圍有太多粗暴的處理了,無端地引入微服務架構,只會將糟糕的代碼變成糟糕的基礎設施,

我喜歡充滿熱情的程式員,我曾經是,現在仍然是,他們熱愛自己的作業,超越期望地解決問題,但在做決定時不能這樣,這可能會讓你和公司都損失一大筆錢,很抱歉讓你失望了,微服務不應該是默認的應用程式架構,它們不是你要找的銀彈,遵循 KISS 和 YAGNI 原則,讓自己保持穩定,

作為一名技術倡導者和愛好者,你有權擁有自己的偏好,然而,讓你脫穎而出的是,當選項是“正確的選擇”和“你最喜歡的選擇”時,你要有做出切合實際選擇的能力,

 參考鏈接

https://www.linkedin.com/pulse/stop-you-dont-need-microservices-ebin-joh

 

作者丨Ebin John

 

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/stop-you-dont-need-microservices-ebin-joh.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/528035.html

標籤:架構設計

上一篇:SpringBootRestAPI問題

下一篇:錯誤碼如何設計才合理?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more