1. 程式人生 > >如何設計一個高併發系統?

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

面試題

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

面試官心理分析

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

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

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

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

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

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

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

面試題剖析

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

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

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

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

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

可以分為以下 6 點:

  • 系統拆分
  • 快取
  • MQ
  • 分庫分表
  • 讀寫分離
  • ElasticSearch

系統拆分

將一個系統拆分為多個子系統,用 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學習平臺。

相關推薦

如何設計一個併發系統

  系統拆分,將一個系統拆分為多個子系統,用dubbo來搞。然後每個系統連一個數據庫,這樣本來就一個庫,現在多個數據庫,不也可以抗高併發麼。     快取,必須得用快取。大部分的高併發場景,都是讀多寫少,那你完全可以在資料庫和快取裡都寫一份,然後讀的時候大量走快取不就得了。畢竟人家redis

【本人禿頂程式設計師】面試題:如何設計一個併發系統

←←←←←←←←←←←← 我都禿頂了,還不點關注! 面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 裡都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在網際

41、如何設計一個併發系統

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

如何設計一個併發系統

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

簡單設計一個併發系統

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

2018年,Mixin 如何在不可能三角的限制下設計一個併發和快速確認的閃電網路

不可能三角 : 一個分散式記賬系統,不可能同時滿足 可擴充套件性,安全性,和去中心化。 可擴充套件性 :指效能,或者併發能力 安全性 :指賬本一致 去中心化 :這個最有迷惑性,因為人們會把去中心化當作目的。但是去中心的目的是提高生存能力,去中心化越徹底,生存能力越強。 比特幣如何選擇

如何設計一個可用系統?要考慮哪些地方?

本文已經收錄自筆者開源的 JavaGuide: https://github.com/Snailclimb (69k+Star【Java學習+面試指南】 一份涵蓋大部分Java程式設計師所需要掌握的核心知識)如果覺得不錯的還,不妨去點個Star,鼓勵一下! 一篇短小的文章,面試經常遇到的這個問題。本文主要

架構學習之路——可用併發系統設計原則 (轉)

作者 Geekwolf 本文作者為網易高階運維工程師 本文主要是學習開濤《億級流量網站架構核心技術》一書學習筆記及自己的感悟: 架構設計三大定律 墨菲定律 - 任何事沒有表面看起來那麼簡單 - 所有的事都會比預計的時間長 - 可能出錯的事情總會出錯 - 擔心

併發系統設計與時間和空間的平衡

    高併發系統設計與時間和空間的平衡 高可用上文我們已經講過了,可當前網際網路時代,怎麼少的了高併發呢?高併發和高可用一樣, 已經變成各個系統的標配了,如果你的系統QPS沒有個大幾千上萬,都不好意思跟人打招呼,雖然可能每天的呼叫量不超過100。  

【架構】可用併發系統設計原則

網際網路架構下的【高可用高併發】系統設計原則,希望對你有用。   ------------------------------------------------------ ------------------------------------

架構學習之路——可用併發系統設計原則

本系列部落格主要是學習開濤《億級流量網站架構核心技術》一書學習筆記及自己的感悟: 架構設計三大定律 墨菲定律 – 任何事沒有表面看起來那麼簡單 – 所有的事都會比預計的時間長 – 可能出錯的事情總會出錯 – 擔心某種事情發生,那麼它就更有可能發生 康威定律 – 系統架構師公司組織架構的反映 – 按照

網際網路併發系統下的安全認證架構設計

使用的工具是Wireshark,這是一個網路封包分析軟體,用於擷取網路封包,並儘可能顯示出最為詳

併發系統資料庫架構設計

在WEB網站的規模從小到大不斷擴充套件的過程中,資料庫的訪問壓力也不斷的增加,資料庫的架構也需要動態擴充套件,在資料庫的擴充套件過程基本上包含如下幾步,每一個擴充套件都可以比上一步驟的部署方式的效能得到數量級的提升。 1、WEB應用和資料庫部署在同一臺伺服

描述一個高效能可靠的伺服器架構---------如何設計一個秒殺系統

一、秒殺的應用場景 電商網站的搶購活動、12306網站的搶票、搶紅包。 二、秒殺的特點 1、秒殺時大量使用者會在同一時間同時進行搶購,網站瞬時訪問流量激增。 2、資料庫的併發讀寫衝突以及資源的鎖請求衝突非常嚴重。 3、秒殺一般是訪問請求數量遠遠大於

併發系統限流設計

概述 高併發系統時有三把利器用來保護系統:快取、降級和限流,快取的目的是提升系統訪問速度和增大系統能處理的容量,降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待高峰或者問題解決後再開啟,而有些場景並不能用快取和降級來解決,比如

並發解決方案】5、如何設計一個秒殺系統

電商 進程 atom 統架構 多用戶 能力 如果能 後臺 寫鎖 https://www.cnblogs.com/wangzhongqiu/p/6557596.html 什麽是秒殺 秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。對於電商網站中

程式設計師修神之路--併發系統設計負載均衡架構

菜菜哥,上次你給我講的分庫分表策略對我幫助很大 有幫助就好,上次請我的咖啡也很好喝~ 呵呵,不過隨著訪問量的不斷加大,網站我又加了nginx做負載均衡 好呀,看來要進階高階工程師啦~ 負載均衡也很簡單呀,一個nginx就搞定了,現在可以說我精通負載均衡了吧 其實負載均衡的內容還有很多 一個系統

聊聊併發系統之降級特技(轉)

在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。之前已經有一些文章介紹過快取和限流了。本文將詳細聊聊降級。當訪問量劇增、服務出現問題(如響應時間慢或不響應)或非核心服務影響到核心流程的效能時,仍然需要保證服務還是可用的,即使是有損服務。系統可以根據一些關鍵資料進行自動降級,也

聊聊併發系統之限流特技(二)(轉)

上一篇《聊聊高併發系統限流特技-1》講了限流演算法、應用級限流、分散式限流;本篇將介紹接入層限流實現。 接入層限流 接入層通常指請求流量的入口,該層的主要目的有:負載均衡、非法請求過濾、請求聚合、快取、降級、限流、 A/B 測試、服務質量監控

2、如何設計一個秒殺系統

https://www.cnblogs.com/wangzhongqiu/p/6557596.html 什麼是秒殺 秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。對於電商網站中一些稀缺或者特價商品,電商網站一般會在約定時間點對其進行限量銷售,因為這些商品的特殊性