高並發系統設計(一):它的通用設計方法是什么?


高並發代表着大流量,高並發系統設計的魅力就在於我們能夠憑借自己的聰明才智設計巧妙的方案,從而抵抗巨大流量的沖擊,帶給用戶更好的使用體驗。這些方案好似能操縱流量,讓流量更加平穩得被系統中的服務和組件處理。

而我們在應對高並發大流量時歸納起來共有三種方法。

  • Scale-out(橫向擴展):分而治之是一種常見的高並發系統設計方法,采用分布式部署的方式把流量分流開,讓每個服務器都承擔一部分並發和流量。

  • 緩存:使用緩存來提高系統的性能,抵抗高並發大流量的沖擊。

  • 異步:在某些場景下,未處理完成之前,我們可以讓請求先返回,在數據准備好之后再通知請求方,這樣可以在單位時間內處理更多的請求。

一、Scale-out

      硬件上不斷提升CPU性能的方案叫做Scale-up(縱向擴展),把類似CPU多核心的方案叫做Scale-out,這兩種思路在實現方式上是完全不同的。

  • Scale-up,通過購買性能更好的硬件來提升系統的並發處理能力,比方說目前系統4核4G每秒可以處理200次請求,那么如果要處理400次請求呢?我們把機器的硬件提升到8核8G(硬件資源的提升可能不是線性的,這里僅為參考)。

  • Scale-out,則是另外一個思路,它通過將多個低性能的機器組成一個分布式集群來共同抵御高並發流量的沖擊。沿用剛剛的例子,我們可以使用兩台4核4G的機器來處理那400次請求。

那么什么時候選擇Scale-up,什么時候選擇Scale-out呢?一般來講,在我們系統設計初期會考慮使用Scale-up的方式,因為這種方案足夠簡單,所謂能用堆砌硬件解決的問題就用硬件來解決,但是當系統並發超過了單機的極限時,我們就要使用Scale-out的方式。

Scale-out雖然能夠突破單機的限制,但也會引入一些復雜問題。比如,如果某個節點出現故障如何保證整體可用性?當多個節點有狀態需要同步時,如何保證狀態信息在不同節點的一致性?如何做到使用方無感知的增加和刪除節點?等等.....

二、緩存

      緩存的讀取速度快,我們通常使用以內存作為存儲介質的緩存,以此提升性能。

三、異步

什么是同步,什么是異步呢?

以方法調用為例,同步調用代表調用方要阻塞等待被調用方法中的邏輯執行完成。這種方式下,當被調用方法響應時間較長時,會造成調用方長久的阻塞,在高並發下會造成整體系統性能下降甚至發生雪崩。

異步調用恰恰相反,調用方不需要等待方法邏輯執行完成就可以返回執行其他的邏輯,在被調用方法執行完畢后再通過回調、事件通知等方式將結果反饋給調用方。

異步的方式,后端處理時會把請求丟到消息隊列中,同時快速響應客戶端,告訴用戶我們正在排隊處理,然后釋放出資源來處理更多的請求。訂票請求處理完之后,再通知客戶端成功或者失敗。

處理邏輯后移到異步處理程序中,Web服務的壓力小了,資源占用的少了,自然就能接收更多的用戶請求,系統承受高並發的能力也就提升了。

 

 

系統架構設計要靈活

一般系統的演進過程應該遵循下面的思路:

  • 最簡單的系統設計滿足業務需求和流量現狀,選擇最熟悉的技術體系。

  • 隨着流量的增加和業務的變化,修正架構中存在問題的點,如單點問題,橫向擴展問題,性能無法滿足需求的組件。在這個過程中,選擇社區成熟的、團隊熟悉的組件幫助我們解決問題,在社區沒有合適解決方案的前提下才會自己造輪子。

  • 當對架構的小修小補無法滿足需求時,考慮重構、重寫等大的調整方式以解決現有的問題。

歸根結底一句話:高並發系統的演進應該是循序漸進,以解決系統中存在的問題為目的和驅動力的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM