如何設計一個高併發系統?

来源:https://www.cnblogs.com/midoujava/archive/2019/09/11/11509392.html
-Advertisement-
Play Games

面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 里都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在互聯網公司里乾過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官 ...


面試題

如何設計一個高併發系統?

面試官心理分析

說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 里都是說啥,有高併發就經驗者優先。

如果你確實有真才實學,在互聯網公司里乾過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官也絕對不會這樣來問你,否則他就是蠢。

假設你在某知名電商公司乾過高併發系統,用戶上億,一天流量幾十億,高峰期併發量上萬,甚至是十萬。那麼人家一定會仔細盤問你的系統架構,你們系統啥架構?怎麼部署的?部署了多少台機器?緩存咋用的?MQ 咋用的?資料庫咋用的?就是深挖你到底是如何扛住高併發的。

因為真正乾過高併發的人一定知道,脫離了業務的系統架構都是在紙上談兵,真正在複雜業務場景而且還高併發的時候,那系統架構一定不是那麼簡單的,用個 redis,用 mq 就能搞定?當然不是,真實的系統架構搭配上業務之後,會比這種簡單的所謂“高併發架構”要複雜很多倍。

如果有面試官問你個問題說,如何設計一個高併發系統?那麼不好意思,一定是因為你實際上沒乾過高併發系統。面試官看你簡歷就沒啥出彩的,感覺就不咋地,所以就會問問你,如何設計一個高併發系統?其實說白了本質就是看看你有沒有自己研究過,有沒有一定的知識積累。

最好的當然是招聘個真正乾過高併發的哥兒們咯,但是這種哥兒們人數稀缺,不好招。所以可能次一點的就是招一個自己研究過的哥兒們,總比招一個啥也不會的哥兒們好吧!

所以這個時候你必須得做一把個人秀了,秀出你所有關於高併發的知識!

面試題剖析

其實所謂的高併發,如果你要理解這個問題呢,其實就得從高併發的根源出發,為啥會有高併發?為啥高併發就很牛逼?

我說的淺顯一點,很簡單,就是因為剛開始系統都是連接資料庫的,但是要知道資料庫支撐到每秒併發兩三千的時候,基本就快完了。所以才有說,很多公司,剛開始乾的時候,技術比較 low,結果業務發展太快,有的時候系統扛不住壓力就掛了。

當然會掛了,憑什麼不掛?你資料庫如果瞬間承載每秒 5000/8000,甚至上萬的併發,一定會宕機,因為比如 mysql 就壓根兒扛不住這麼高的併發量。

所以為啥高併發牛逼?就是因為現在用互聯網的人越來越多,很多 app、網站、系統承載的都是高併發請求,可能高峰期每秒併發量幾千,很正常的。如果是什麼雙十一之類的,每秒併發幾萬幾十萬都有可能。

那麼如此之高的併發量,加上原本就如此之複雜的業務,咋玩兒?真正厲害的,一定是在複雜業務系統里玩兒過高併發架構的人,但是你沒有,那麼我給你說一下你該怎麼回答這個問題:

可以分為以下 6 點:

  • 系統拆分
  • 緩存
  • MQ
  • 分庫分表
  • 讀寫分離
  • ElasticSearch
    file

系統拆分

將一個系統拆分為多個子系統,用 dubbo 來搞。然後每個系統連一個資料庫,這樣本來就一個庫,現在多個資料庫,不也可以扛高併發麽。

緩存

緩存,必須得用緩存。大部分的高併發場景,都是讀多寫少,那你完全可以在資料庫和緩存里都寫一份,然後讀的時候大量走緩存不就得了。畢竟人家 redis 輕輕鬆松單機幾萬的併發。所以你可以考慮考慮你的項目里,那些承載主要請求的讀場景,怎麼用緩存來抗高併發

MQ

MQ,必須得用 MQ。可能你還是會出現高併發寫的場景,比如說一個業務操作里要頻繁搞資料庫幾十次,增刪改增刪改,瘋了。那高併發絕對搞掛你的系統,你要是用 redis 來承載寫那肯定不行,人家是緩存,數據隨時就被 LRU 了,數據格式還無比簡單,沒有事務支持。所以該用 mysql 還得用 mysql 啊。那你咋辦?用 MQ 吧,大量的寫請求灌入 MQ 里,排隊慢慢玩兒,後邊系統消費後慢慢寫,控制在 mysql 承載範圍之內。所以你得考慮考慮你的項目里,那些承載複雜寫業務邏輯的場景里,如何用 MQ 來非同步寫,提升併發性。MQ 單機抗幾萬併發也是 ok 的,這個之前還特意說過。

分庫分表

分庫分表,可能到了最後資料庫層面還是免不了抗高併發的要求,好吧,那麼就將一個資料庫拆分為多個庫,多個庫來扛更高的併發;然後將一個表拆分為多個表,每個表的數據量保持少一點,提高 sql 跑的性能。

讀寫分離

讀寫分離,這個就是說大部分時候資料庫可能也是讀多寫少,沒必要所有請求都集中在一個庫上吧,可以搞個主從架構,主庫寫入,從庫讀取,搞一個讀寫分離。讀流量太多的時候,還可以加更多的從庫

ElasticSearch

Elasticsearch,簡稱 es。es 是分散式的,可以隨便擴容,分散式天然就可以支撐高併發,因為動不動就可以擴容加機器來扛更高的併發。那麼一些比較簡單的查詢、統計類的操作,可以考慮用 es 來承載,還有一些全文搜索類的操作,也可以考慮用 es 來承載。

上面的 6 點,基本就是高併發系統肯定要乾的一些事兒,大家可以仔細結合之前講過的知識考慮一下,到時候你可以系統的把這塊闡述一下,然後每個部分要註意哪些問題,之前都講過了,你都可以闡述闡述,表明你對這塊是有點積累的。

說句實話,畢竟你真正厲害的一點,不是在於弄明白一些技術,或者大概知道一個高併發系統應該長什麼樣?其實實際上在真正的複雜的業務系統里,做高併發要遠遠比上面提到的點要複雜幾十倍到上百倍。你需要考慮:哪些需要分庫分表,哪些不需要分庫分表,單庫單表跟分庫分表如何 join,哪些數據要放到緩存里去,放哪些數據才可以扛住高併發的請求,你需要完成對一個複雜業務系統的分析之後,然後逐步逐步的加入高併發的系統架構的改造,這個過程是無比複雜的,一旦做過一次,並且做好了,你在這個市場上就會非常的吃香。

其實大部分公司,真正看重的,不是說你掌握高併發相關的一些基本的架構知識,架構中的一些技術,RocketMQ、Kafka、Redis、Elasticsearch,高併發這一塊,你瞭解了,也只能是次一等的人才。對一個有幾十萬行代碼的複雜的分散式系統,一步一步架構、設計以及實踐過高併發架構的人,這個經驗是難能可貴的。

本文在米兜公眾號鏈接:
https://mp.weixin.qq.com/s/9p-XPL_FRqN5nhbiwmOXSw

歡迎關註米兜Java,一個註在共用、交流的Java學習平臺。

file


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

-Advertisement-
Play Games
更多相關文章
  • 面向微服務的體繫結構如今風靡全球。這是因為更快的部署節奏和更低的成本是面向微服務的體繫結構的基本承諾。 然而,對於大多數試水的公司來說,開發活動更多的是將現有的單塊應用程式轉換為面向微服務的體繫結構,這可能是許多層面上阻礙和衝突的根源。 雖然 "Greenfield" (未開發的)面向微服務的體繫結 ...
  • 一、JVM包含三個記憶體區:棧記憶體、堆記憶體、方法區記憶體 二、註意點 (1)在MyEclipse中字體是紅色的是一個類的名字,並且這個類除了我們自定義的類是JavaSE類庫中自帶的 (2)其實JavaSE類庫中自帶的類,例如:String.class\System.class,這些類的類名也是標識符 ( ...
  • 一個可以沉迷於技術的程式猿,wx加入加入技術群:fsx641385712 ...
  • 作為開發人員,大家都知道,SpringBoot是基於Spring4.0設計的,不僅繼承了Spring框架原有的優秀特性,而且還通過簡化配置來進一步簡化了Spring應用的整個搭建和開發過程。另外SpringBoot通過集成大量的框架使得依賴包的版本衝突,以及引用的不穩定性等問題得到了很好的解決。 S ...
  • 如何逃離令人抓狂的 if-else 參數校驗的代碼,Van 帶你用validator快速搞定,節省更多的時間勾搭小姐姐。 ...
  • 原文再續,書接上一回 上回講到了,python IDLE的草稿本和作業本,並順便試了試python的輸入輸出,變數,運算的體驗,大家應該能感受到python的簡單了吧。 下麵我們繼續體驗python的強大,python之所以強大,是因為python有庫。(就如同人一樣學會了穿褲子也變得強大了) 課程 ...
  • 房天下 登錄 本次爬取的網址為: 一、分析請求 輸入用戶名和密碼,點擊登錄按鈕 請求的參數為: 就是輸入的用戶名, 是將密碼加密後的數據。我們只要找出密碼的加密方式就可以模擬登錄了。 二、密碼加密方式破解 這次我們以 作為關鍵字,進行搜索 找到加密位置之後,我們打上斷點,重新點擊登錄 找到密碼加密的 ...
  • 內容來自轉載整理 1.NumPy數值計算 NumPy是使用Python進行科學計算的基礎包,Numpy可以提供數組支持以及相應的高效處理函數,是Python數據分析的基礎,也是SciPy、Pandas等數據處理和科學計算庫最基本的函數功能庫,且其數據類型對Python數據分析十分有用。它包含: 一個 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...