軟體性能測試(連載20)

  • 2020 年 3 月 26 日
  • 筆記

3.6結構優化

隨著雲計算的大力發展。通過結構優化來提高軟體性能,在軟體研發中受到越來越大的重視。

1. 互聯網架構演化

在談論結構優化之前,先來看看互聯網架構發展的歷史。

最原始的互聯網架構圖如圖3-40所示,這個時候後端僅僅存在Web伺服器和資料庫伺服器,而且這兩個伺服器是處於同一條機器上的。

第二代互聯網架構是Web伺服器和資料庫伺服器處於一個單獨的伺服器中,如圖3-41所示。

圖3-40 最原始的互聯網路結構

圖3-41 Web伺服器和資料庫伺服器分離

第三代互聯網架構引入本地快取和分散式快取的模組,性能得到了提升,如圖3-42所示。

第四代互聯網架構引入了Nginx反向代理實現負載均衡,如圖3-43所示。

圖3-42 本地快取和分散式快取

圖3-43 Nginx反向代理實現負載均衡

第五代互聯網架構將資料庫讀寫進行了分離,如圖3-44所示。

第六代互聯網架構資料庫按業務分庫,在這裡分離了課件業務、購買業務以及其他業務,如圖3-45所示。

圖3-44 資料庫讀寫分離

圖3-45 資料庫按業務分庫

第七代互聯網架構把資料庫中的大表拆分成小表,如圖3-46所示。

第八代互聯網架構使用LVS或F5來使多個Nginx負載均衡,如圖3-47所示。

圖3-46 把大表拆分成小表

圖3-47 使用LVS或F5來使多個Nginx負載均衡

第九代互聯網架構通過DNS輪詢實現機房間的負載均衡,如圖3-48所示。

第十代互聯網架構引入NoSQL資料庫和搜索引擎等技術,如圖3-49所示。

圖3-48 通過DNS輪詢實現機房間的負載均衡

圖3-49 引入NoSQL資料庫和搜索引擎等技術

第十一代互聯網架構把大應用拆分為小應用,如圖3-50所示。

第十二代互聯網架構復用的功能抽離成微服務,如圖3-51所示。

圖3-50 把大應用拆分為小應用

圖3-51 Nginx反向代理實現負載均衡

第十三代互聯網架構把應用建立到雲上。

互聯網架構的改進使得產品的性能越來越好,但是千萬不能認為只要加機器就可以解決性能問題的觀念,有些問題,比如記憶體溢出,不是簡單地通過加機器就可以解決的。

2. 虛擬節點

接下來看一下虛擬節點。分散式結構是由多台機器集成的,但是每台機器的性能往往是不相同的,如果不引入虛擬節點,每個機器承載的負載是相同的,如圖3-52所示,任務通過m=rand(232)%4+1分配到1號機、2號機、3號機和4號機這四個節點上。這裡1號機與2號機硬體性能比較好,3號機其次,4號機最差。所以可以這樣建立虛擬節點,如圖3-53所示。

圖3-52 不帶虛擬節點的分散式結構圖

圖3-53 帶虛擬節點的分散式結構

1號機、2號機性能好,分配3個虛擬節點;3號機其次,分配2個虛擬節點;4號機最差,分配1個虛擬節點。這樣分配公式變為m=rand(232)%9+1。性能好的機器分配到的任務概率比性能差的機器要高。

在看一種情況,隨著業務需求的增長,要向虛擬節點中插入一台5號機器,如圖3-54所示。

圖3-54 在分散式結構中加入節點

圖3-55 帶虛擬節點的分散式結構

圖3-56 在帶虛擬節點的分散式結構中加入節點

由於存在「會話黏連效應」,以前分配給1號機、2號機、3號機、4號機上的任務不會由於加入新的物理機器而進行重新分配,比如,添加新節點前服務A1以前在1號機上運行,添加後服務A1仍舊會滯留在1號機上上。據說前幾年京東發生的「快取雪崩」事故就是這樣造成的,加入了新的物理節點,但是沒有引入虛擬節點,結果新節點沒有被有效地利用,快取溢出,從而造成事故。如果採取虛擬節點,當5號機器加入之前,服務在每個虛擬節點上分配如圖3-55所示。當5號機器加入後,虛擬節點號是可以進行的重新分配的,而服務又僅僅與虛擬節點號綁定,所以加入新機器後,服務發生了重組,新加入的節點起到了分擔服務的作用,如圖3-56所示。。

3. MapReduce

MapReduce是一種大數據技術,其實分為Map和Reduce兩個方法,它也是通過分散式提高性能的一種手段。假設現在有一套《大英百科全書》,要統計每個單詞出現的次數,如果這個工作讓單機來完場,顯然是十分困難的。如果採用分散式架構,把《大英百科全書》的第1冊第1章分配給1號機器處理、第1冊第2章分配給2號機器處理、…、第2冊第1章分配給m號機器處理…。所有的機器計算完畢匯總給另外一台機器進行總結,如圖3-57所示。

圖3-57 MapReduce

分發的過程使用了Map方法,匯總使用了Reduce方法。這樣就大大提高了單機作業的速度。