主頁 > 軟體設計 > 并發與性能調優(面試題)

并發與性能調優(面試題)

2021-09-14 12:01:48 軟體設計

目錄

1、 每秒鐘 5k 個請求,查詢手機號的筆試題,設計演算法?

2、 高并發情況下,我們系統是如何支撐大量的請求的?

3、 集群如何同步會話狀態?

4、 負載均衡的原理?

網站訪問量已經越來越大,回應速度越來越慢,

5、 怎么提高并發量,請列舉你所知道的方案?

6、 系統的用戶量有多少?多用戶并發訪問時如何解決?

7、 如果有一個特別大的訪問量,到資料庫上,怎么做優化?

? 8、 大面積并發,在不增加服務器,如何解決服務器回應不及時問題?


1、 每秒鐘 5k 個請求,查詢手機號的筆試題,設計演算法?

請求再多,比如 5w,如何設計整個系統? 設計出每秒并 5K 的一個系統,根據網上的這個題目做以下梳理,眾所周知一個良好的架構 需要考慮它的高可用和可伸縮,需要做服務的熔斷、降級、隔離等等

架構設計原理:

1、路由網關-流量分發入口,不承載具體業務,簡單點可以使用 nginx,如果是微服務可以使用 zuul 等(支持請求的分發、限流、下游依賴的發現,可以結合 docker 實作服務下游的web 服務自動伸縮),如果采用 nginx 完成不了下游的伸縮發現,但是基本的限流和分發可以解決

2、web 服務-可以水平擴展,通過 cache 加速,查詢手機號碼號段對應的地區,對于快取未命中的號段,直接丟入 kafka 佇列,實時回傳 client 端查詢中的狀態

3、消費微服務-完成 kafka 佇列的消費,根據 kafka topic 的 partition 個數也可以實作水平擴展,負責把發送號段的查詢請求至實時查詢微服務,保存至 cache

4、實時查詢微服務-因為是無狀態服務,根據業務負載也可以實作水平擴展,且僅負責對外部運營商的查詢,根據外部供應商的介面能力,也可以通過 hystrix 把該服務 export 出的介面做限流和熔斷,這樣影響面就不會波及外部合作伙伴

5、快取預熱服務-為提升體驗,減少發出查詢請求后的重繪等待時間,在服務發布前,可以預先把一批號段通過請求實時查詢微服務,并先保存起來 總結如上設計:快取讀取不會形成瓶頸,佇列生產不會形成瓶頸,唯一形成瓶頸的點有可能發生在外部運營商介面,因此我們會對實時查詢服務做限流和熔斷,所以不會壓垮運營商,但是用戶端的體驗就糟些了,所以我們需要把快取預熱的功夫做足,改善體驗,上面的設計在不同場景下需要進行微調,基本思想不會發生大的變化,把請求異步化,一天吃不成胖子,就分多天吃,就是這個意思,當然還考察了服務的隔離、降級、可伸縮的特性!

2、 高并發情況下,我們系統是如何支撐大量的請求的?

1、盡量使用快取技術, 包括用戶快取,資訊快取還有靜態頁面快取,多花點記憶體來做快取,可以大大減少與資料庫的互動次數和 tomcat 執行次數,減少不變的資料重復在 tomcat 和資料庫中獲取的次數,

2、同步轉異步, 對于一些不需要即時結果的操作,可以使用 MQ 訊息機制,達到同步轉異步的效果,如秒殺系統,正常流程:先點擊秒殺,然后往服務器發送請求,在頁面等待回應,這樣融入大量請求,服務器壓力會特別大,搞不好服務器就會宕機,使用 MQ 訊息佇列實作異步的步驟為:點擊秒殺,回傳請稍后查看結果,請求去 MQ 佇列中排隊,等排隊執行完成后回傳給用戶資訊,這樣就可以大大減少服務器的壓力,提升用戶體驗度,

3、合并多個同型別請求為一個請求, 使用 SpringCloud 的 Hystrix 技術來實作,在服務提供者提供了回傳單個物件和多個物件的介面,并且單個物件的查詢并發數很高,服務提供者負載較高的時候,我們就可以使用請求合并來降低服務提供者的負載,

4、資料庫方面, 搭建資料庫集群,網站一般讀的多寫的少,可以按照網站的統計資料來找到一個合適的平衡點,來搭建主從資料庫服務,可以實作一主多從,或者多主多從,來減輕單個資料庫的壓力,可以按照每臺資料庫服務器的硬體條件,合理分配權重,配合 Mycat 達到負載均衡, 5、高質量代碼, 合理的使用回圈和遞回,不要為了速度丟了記憶體,也不要為記憶體丟了速度,要看業務場景,來合理使用,減少自動處理邏輯,比如字串拼接,每次拼接都會創建一個字串放入常量池,這里可以按照業務場景來使用 StringBuilder 或者 StringBuffer 來進行字串拼接,能手動處理就手動處理,代碼中所有的臨時物件,用完之后都賦值為 Null,這樣可以減少 GC 的重復排查,效率就會有所提升,所有的資源用完都要回收,如:IO、資料庫連接物件等,因為這些資源對 GC 不是特別友好,減少代碼呼叫鏈,盡量不要讓代碼呼叫鏈超過 10,遠程方法呼叫沒事,提供過濾能力,把每個過濾器寫的詳細一點,把耦合度高的資料放入到同一個過濾器中,如果第一個過濾器沒有通過那么后面的過濾器不執行,相對的業務也就不執行了,效率也就提升了,

6、網路優化, 外網轉內網,內網轉局域網,外網轉 VPN,配合公司內的網路運維人員,進行網路網段的切換,盡量讓服務器群處于內網,或者局域網中,提供訪問速度,服務器之間的通訊如果都是局域網內進行的,那么可想而知,訪問速度肯定有所提升,

7、中間件處理 搭建 Tomcat 集群,通過 Nginx 代理 Tomcat 服務器做負載均衡,對每個 Tomcat 的調優,合理設定設定 Tomcat 的最大連接數,因為 Tomcat 的默認最大并發數為 200,適當的加大 Tomcat的記憶體和最多執行緒數,設定 JVM 的處置大小為服務器可用記憶體的最大值的 80%,關閉 DNS查詢,開啟 gzip 壓縮, 搭建 MQ 集群,高并發的時候一個 MQ 來處理佇列根本不夠用,這時可以搭建集群來處理,增加 Nginx 的記憶體,加大 Nginx 快取資料的范圍,服務器作業系統都用 64 位的,因為 32 位的系統最大記憶體只能有 4G 圖片服務器分離,搭建 vsftpd 服務器來存盤圖片資料,通過 Nginx 代理 vsftpd 存放路徑就可以直接訪問到圖片,這樣回應到頁面的只是超鏈接,并不是圖片,這樣頁面的回應會得到大大的提升,

3、 集群如何同步會話狀態?

利用 Redis 同步 session Redis 可以做分布式,正式因為這個功能他才可以用來做 session 同步,他可以把 web 服務器中的記憶體組合起來,形成一個“記憶體池”,不管是哪個服務器產生的 session 都可以存放于這個記憶體池中,其它的都可以使用, 以這種方式來同步 session,不會加大資料庫的負擔,安全性比 cookie 要大大提高,把 session放到記憶體中,這樣比從檔案讀取也要快很多,

4、 負載均衡的原理?

網站訪問量已經越來越大,回應速度越來越慢,

考慮: Scale Up(也就是 Scale vertically)縱向擴展,向上擴展:機器硬體升級,增加配置,如添加CPU、記憶體,(往往需要購置新機器)–>舊機器不能利用上,

Scale Out(也就是 Scale horizontally)橫向擴展,向外擴展:向原有的 web、郵件系統添加一個新機器,–>舊機器仍然可以發揮作用,

負載均衡技術為 scale out 服務,

Nginx 負載均衡器的特點是:

1. 作業在網路的 7 層之上,可以針對 http 應用做一些分流的策略,比如針對域名、目錄結構;

2. Nginx 安裝和配置比較簡單,測驗起來比較方便;

3. 也可以承擔高的負載壓力且穩定,一般能支撐超過上萬次的并發;

4. Nginx 可以通過埠檢測到服務器內部的故障,比如根據服務器處理網頁回傳的狀態碼、超時等等,并且會把回傳錯誤的請求重新提交到另一個節點,不過其中缺點就是不支持 url來檢測;

5. Nginx 對請求的異步處理可以幫助節點服務器減輕負載;

6. Nginx 能支持 http 和 Email,這樣就在適用范圍上面小很多;

7. 默認有三種調度演算法: 輪詢、weight 以及 ip_hash(可以解決會話保持的問題),還可以 支持第三方的 fair 和 url_hash 等調度演算法;

5、 怎么提高并發量,請列舉你所知道的方案?

HTML 靜態化 模板引擎

圖片服務器分離 Nginx

資料庫集群、庫表散列 資料分片 Mycat

快取 基于 Redis

鏡像是大型網站常采用的提高性能和資料安全性的方式

負載均衡

CDN 加速技術

6、 系統的用戶量有多少?多用戶并發訪問時如何解決?

分布式是以縮短單個任務的執行時間來提升效率的,而集群則是通過提高單位時間內執行的任務數來提升效率,

集群主要分為:高可用集群(High Availability Cluster),負載均衡集群(Load Balance Cluster,nginx 即可實作),科學計算集群(High Performance Computing Cluster),分布式是指將不同的業務分布在不同的地方;而集群指的是將幾臺服務器集中在一起,實作同一業務,分布式中的每一個節點,都可以做集群, 而集群并不一定就是分布式的,采用微服務架構,使用技術 Spring Cloud 的一站式解決方案

7、 如果有一個特別大的訪問量,到資料庫上,怎么做優化?

1. SQL 陳述句的優化處理 通過慢查詢確認執行效率低下的 SQL 陳述句,進行拆解和索引的控制

2. 為資料庫搭建集群,實作主從復制

3. 實作資料庫的讀寫分離

4. 實作資料的分片處理

5. 采用資料庫中間件 Mycat

8、 大面積并發,在不增加服務器,如何解決服務器回應不及時問題?

衡量服務器的并發能力

1.吞吐率

吞吐率,單位時間里服務器處理的最大請求數,單位 req/s

2.壓力測驗

使用 Jmeter,壓力測驗中關心的時間又細分以下 2 種:

用戶平均請求等待時間(這里暫不把資料在網路的傳輸時間,還有用戶 PC 本地的計算時間 計算入內)

服務器平均請求處理時間

提高服務器的并發能力

1.提高 CPU 并發計算能力

2.考慮減少記憶體分配和釋放

3.考慮使用持久連接

4.改進 I/O 模型

5.Sendfile Linux 提供 sendfile()系統呼叫,可以講磁盤檔案的特定部分直接傳送到代表客戶端的 socket 描述符,加快了靜態檔案的請求速度,同時減少 CPU 和記憶體的開銷,

6.記憶體映射

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

標籤:其他

上一篇:分布式相關(面試題)

下一篇:系統架構可用性存隱患?試一下美國NASA都在用的FMEA方法

標籤雲
其他(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