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

来源:https://www.cnblogs.com/88223100/archive/2022/11/04/stop-you-dont-need-microservices-ebin-joh.html
-Advertisement-
Play Games

2020 年,很多技術人可能都已經迷醉在了微服務的成功故事中,但現實很骨感,微服務也不是“靈丹妙藥”。本文想給現階段“狂熱”的微服務潑潑冷水、降降溫,也許你就會發現,你並不是真的需要微服務。 2020 年,如果再講什麼是微服務,已經落伍了,畢竟微服務的成功故事已經開始在業界廣為流傳了。但是你真的需要... ...


 

 

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CitusData於日前推出了Citus11.0,並宣佈將所有企業版的特性都進行開源。此前,Citus在版本更新時通常會同步發佈2個版本:開源版本和包含一些額外功能的企業版本。“但是,Citus11.0將只有一個版本,因為Citus擴展中的所有內容現在都是完全開源的!” 公告指出,這意味著你現在可... ...
  • 一、引言 理解和分析這個數據包結構(這裡面也涉及廣播間隔時間的設置,設備廣播數據間隔設置長了,會影響設備被髮現的效率;設置短時,又響應功耗)。 我們所說的BLE設備,其實是有區分有兩種角色 Central 和 Peripheral,也就是中心設備和外圍設備。中心設備可以主動連接外圍設備,外圍設備發送 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 相信用過vue的小伙伴,肯定被面試官問過這樣一個問題:在vue中動態的引入圖片為什麼要使用require 有些小伙伴,可能會輕蔑一笑:呵,就這,因為動態添加src被當做靜態資源處理了,沒有進行編譯,所以要加上require, 我倒著都能背 ...
  • 有這樣一道面試題:nextTick是什麼? 我們做如下實驗,在磁碟任意的位置(確保今後可以想起來),新建nextTick文件夾(可以命名為其他的)。 通過命令vue create demo創建以demo命名的vue2項目。 為了方便調試項目,我們通過VS Code打開創建的vue2項目demo。 我 ...
  • 一,面試基礎 HTML和CSS ps:這倆面試答不上來的,基本就可以回去了,以下是HTML題,一般來說這地方不會出太多題,面試官也不願意花太多時間在這上面。 1,HTML語義化,如何理解語義化? 讓人更容易懂(增加代碼的可讀性) 讓搜索引擎更容易懂,有利於爬蟲抓取 在沒有css的情況下,頁面也能更好 ...
  • 本文開始,首先我們來看這兩個詞的意思,provide:提供 inject:註入 用處: 父組件可以向其所有子組件傳入數據,而“不管子組件層次結構有多深(非父子和父子咱都能傳)” 特性: 父組件有一個provide選項來提供數據 子組件有一個inject選項來開始使用這個數據 本文參考組件層級: In ...
  • 1. 撲朔迷離的 this 從錶面來看,this 總能通過各種變通的方式得到意想不到的結果 既然是“意想不到”,就說明對“各種變通的方式”不太瞭解 那麼我們來看看“各種變通的方式” 老早以前,this 指向它的調用者 1 <script> 2 // 通過 dom 調用 3 var _html = d ...
  • 一般來說,普通的 Angular 應用是在 瀏覽器 中運行,在 DOM 中對頁面進行渲染,並與用戶進行交互。而 Angular Universal 是在 服務端 進行渲染(Server-Side Rendering,SSR),生成靜態的應用程式網頁,然後在客戶端展示,好處是可以更快地進行渲染,在提供 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...