您好,登錄后才能下訂單哦!
當前在互聯網+的大潮下,眾所周知淘寶、京東這些交易系統每天產生的數據量都是海量的,每天的交易并發也是驚人的,尤其是“雙11”、“6.18”這些活動,對系統的峰值響應提出了非常高的要求,所以對系統架構也就有了很要的要求。
在寫這篇博客的前2天,聽說某系統在25人的用戶量下就宕機了,實在讓人震驚,所以捋了下互聯網交易系統我們可以采取哪些技術來解決互聯網平臺下大數據量高并發的問題。
首先根據架構分層把不同技術進行了一些分類,如下圖:
互聯網技術架構分層策略圖
接下來我會逐一解釋各個技術的大概原理和思路,供大家參考和學習:
一、互聯網層
1、負載均衡
負載均衡英文名稱為Load Balance,意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
比如Nginx是一款可以通過反向代理實現負載均衡的服務器,把流量導向不同的服務器;現在的云平臺都提供了負載均衡服務,不過需要單獨付費,比如阿里的SLB。
2、內容分發網絡(CDN)
內容分發網絡基本思路是盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。
通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。
其目的,是使用戶可就近取得所需內容,解決Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。這個不需要單獨去實現,可以用現成的產品去做,比如: Akamai(好些,比較貴),Verizon EdgeCast(便宜些),ChinaCach;如果是云平臺基本上都提供了這個服務,不過也需要付費的,比如阿里云基于自己的CDN加速提供了不同形式的加速;比如基于P2P技術的PCDN,增強防護DDoS、CC、Web應用攻擊的SCDN以及全站加速。
二、Web服務器層
1、Session→Cookie
傳統的B/S架構都是把用戶會話放到Session里面,在在線用戶量不高的情況下沒啥問題,但是對于現在互聯網采取了分布式或者微服務架構,就很難單獨去維護Session了,因為Session會分布在不同的服務器上,會話的同步會面臨著很大的問題。所以一種方式是把Session的維護拿到Cookie里去做,不依賴于某臺或多臺服務器,同時也減少了服務器的開銷。當然,也可以利用內存緩存服務器來統一存儲Session信息,有的內存緩存服務器還能把內存數據持久化到磁盤來提高可用性和可恢復性,就不會有同步問題了。
2、Static page
動態頁面靜態化,為什么又要把動態網頁以靜態網頁的形式發布呢?一個很重要的原因就是搜索引擎;另一個重要原因就是提高程序性能。
很多大型網站,進去的時候看它頁面很復雜,但是加載也沒有耗費多長時間,原因在于先于用戶獲取資源或數據庫數據,進而通過靜態化處理,生成靜態頁面。所有人都訪問這一個靜態頁面,而靜態化處理的頁面本身的訪問速度要較動態頁面快很多倍,因此程序性能會有大大的提升。使用場景是那些經常需要訪問但是數據不經常更新的時候。這種情況就是時候將動態頁面靜態化了,比如淘寶的寶貝信息頁面,頁面動態部分可以用AJAX加載進來,比如月銷多少筆。
3、Cache
緩存,Web服務層的緩存依賴于下面三個方面:
瀏覽器端的緩存,比如CSS/JS等;
在CDN這類技術當中做大量頁面緩存來提高就近訪問速度;
自己搭建內存緩存服務器對頻率訪問比較高的頁面進行緩存,比如首頁等。
4、Gzip
利用瀏覽器能自動進行Gzip解壓縮的原理對訪問頁面和資源(含圖片、JavaScript、CSS等)進行Gzip壓縮,減少文件大小,以此來提高網絡加載速度。
5、One file
原理是把多個需要加載的內容合成一個文件,減少加載次數和網絡連接時間,提高訪問效率,比如把小圖標集合合成一個大圖片,把CSS/JavaScript 合成到一個文件里面。
6、Cluster
集群和傳統的高性能計算機技術相比,計算機集群通過一組松散集成的計算機軟件和/或硬件連接起來高度緊密地協作完成計算工作。在某種意義上,它們可以被看作是一臺計算機。
集群系統中的單個計算機通常稱為節點,通常通過局域網連接,但也有其它的可能連接方式。集群計算機通常用來改進單個計算機的計算速度和/或可靠性。一般情況下,集群計算機比單個計算機(比如工作站或超級計算機)性能價格比要高得多,大多數集群采用主從式來管理集群節點,比如Websphere Cluster。
和常見的分布式的不同點在于:集群是同一個業務部署在多個服務器上;分布式是一個業務分拆成多個子業務,或者本身就是不同的業務,部署在不同的服務器上。
簡單地說,分布式是以縮短單個任務的執行時間來提升效率,而集群則是通過提高單位時間內執行的任務數來提升效率。
三、應用服務器或者業務服務器層
1、Distributed/分布式|SC/服務中心|微服務|Decouple/解耦
分布式系統是支持分布式處理的軟件系統,是由通信網絡互聯的多處理機體系結構上執行任務的系統。簡單來說,分布式處理就是多臺相連的計算機各自承擔同一工作任務的不同部分,在人的控制下同時運行,共同完成同一件工作任務。包括分布式操作系統、分布式程序設計語言及其編譯系統、分布式文件系統、分布式數據庫系統、分布式調度系統等。這常常伴隨需要做負載均衡、熔斷和限流等;還得考慮是全量計算還是增量計算等。
所以隨著分布式的發展,微服務架構就變得越來越流行,它的主要作用是將功能分解到離散的各個服務當中,從而降低系統的耦合性,并提供更加靈活的服務支持,圍繞業務領域組件來創建應用,這些應用可獨立地進行開發、管理和迭代。在分散的組件中使用云架構和平臺式部署、管理和服務功能,使產品交付變得更加簡單,所以業務的解耦和拆分的就變得越來越重要。
現在隨著容器(Docker)的發展讓分布式、微服務變得更加靈活和容易,也讓現在支持大數據量高并發提供了很好的基礎設施。
2、Cache
這一層的緩存主要是對高頻數據進行緩存,比如對中間計算結果進行緩存,而且是基于內存緩存居多,比如Memcached和Redis,有的還提供緩存持久化,比如Redis。在分布式計算中經常要對批量數據進行緩存預讀取以提高計算速度。
3、同步轉異步/MQ
同步轉異步的思路一方面不讓進程或者線程阻塞在順序執行里,從而加快程序的執行,就像Node.js用異步和Java用同步做相同計算測試,好多時候速度Node.js比Java還快,不信大家可以試試,像雙11的搶購都是采用了異步機制。
另一方面不讓用戶一直等在那里,用戶可以繼續做別的事情,等異步執行完畢通知用戶。這里面大量用到了消息隊列(MQ),流行的產品很多,最早的WebsphereMQ,到現在的Kafka、RabbitMQ,有些甚至和流行的開源框架緊密集成,比如RabbitMQ和SpringBoot。
四、數據訪問、文件訪問、內部網絡訪問層
1、讀寫分離
因為在大數據量并發情況下,讀的操作頻率遠遠超過寫操作,所以通過讀寫分離來提高讀的速度,其思路是讓主數據庫(master)處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數據庫(slave)處理SELECT查詢操作,下面是淘寶最早的時候采用的讀寫分離策略:
讀寫分離示意圖
2、DB Cluster
集群就不再做過多說明,數據庫集群是利用至少兩臺或者多臺數據庫服務器,構成一個虛擬單一數據庫邏輯映像,像單數據庫系統那樣,向客戶端提供透明的數據服務。其目的還是為了增加數據吞吐量,提高數據庫性能,滿足大數據量下對數據的讀寫速度要求。
阿里云的RDS云數據庫就繼承了上述2大特征,外面看來是一個MySQL集群,提供統一的透明訪問,而在內部就自動實現了讀寫分離,為高性能數據庫存儲提供了很大便利。
3、分布式存儲(DAS/NAS/SAN)
三種分布式存儲方案,大家可自行百度,各種介紹比較比較多,這里不再贅述,比如阿里的OSS存儲也是一種分布式存儲。
4、Cache
緩存無處不在,連CPU都有二級緩存,在數據訪問這一層,可以根據你的數據需要充分利用緩存技術來提供讀寫速度,比如對要求不是特別實時的大數據進行預統計分析,然后緩存下來做報表等,這個時候直接從緩存里讀取即可,提高統計速度。
5、NoSQL,Key/Value
NoSQL,泛指非關系型的數據庫。隨著互聯網Web2.0網站的興起,傳統的關系數據庫在應付Web2.0網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由于其自身的特點(高可擴展性、分布式計算、低成本、架構的靈活性、半結構化數據,沒有復雜的關系)得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。其數據庫類型有列存儲、文檔存儲、Key/Value存儲、對象存儲和圖存儲等。
6、Split/分割,Partition/分區
表分區是DB對于非常大的表進行優化的一種有效方法,是根據數據庫定義不同的分區策略決定的,比如取模、時間和哈希等,是非常有效的一種手段,在很多情況下比表分割更有效。
比如,有一個代碼表使用分區表把100萬紀錄分在10個分區中(ID每從1到10萬為一個分區),那樣寫查詢語句的時候,只要給出查詢條件中所需要的代碼,DB自動會定位到對應的分區進行查詢,大大降低的查詢時間。
而采用表分割那必須先根據查詢的代碼指定所要查詢的表,才能找到相應的記錄,是由DBA或架構師根據業務需要來定義如何分割的。表分割分為水平分割和垂直分割:
水平分割: 根據一列或多列數據的值把數據行放到兩個獨立的表中;
垂直分割: 把主碼和一些列放到一個表,然后把主碼和另外的列放到另一個表中。
7、BGP
邊界網關協議,主要用于互聯網AS(自治系統)之間的互聯,BGP的最主要功能在于控制路由的傳播和選擇最好的路由。中國網通與中國電信都具有AS號(自治系統號),全國各大網絡運營商多數都是通過BGP協議與自身的AS號來互聯的。
使用此方案來實現雙線路需要在CNNIC(中國互聯網信息中心)申請IDC自己的IP地址段和AS號,然后通過BGP協議將此段IP地址廣播到移動,網通、電信等其它的網絡運營商,使用BGP協議互聯后移動。網通與電信的所有骨干路由設備將會判斷到IDC機房IP段的最佳路由,以保證移動、網通和電信用戶的高速訪問。現在不少的云平臺都支持BGP。
五、總結
“緩存”、“異步”和“分”是互聯網大數據量高并發下架構策略中用的最多的3種策略,從上面各個技術層面,“分”也是占據了大多數技術的核心思想,所以考慮的時候要多想想分哪里、如何分,另外很多業務場景還得想想怎么合。
順便在此給大家推薦一個Java架構方面的交流學習群: 698581634 ,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系,主要針對Java開發人員提升自己,突破瓶頸,相信你來學習,會有提升和收獲。在這個群里會有你需要的內容 朋友們請抓緊時間加入進來吧。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。