面對峰值響應沖擊,解決高并發的三大策略

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

當前在互聯網+的大潮下,眾所周知淘寶、京東這些交易系統每天產生的數據量都是海量的,每天的交易并發也是驚人的,尤其是“雙11”、“6.18”這些活動,對系統的峰值響應提出了非常高的要求,所以對系統架構也就有了很要的要求。

在寫這篇博客的前2天,聽說某系統在25人的用戶量下就宕機了,實在讓人震驚,所以捋了下互聯網交易系統我們可以采取哪些技術來解決互聯網平臺下大數據量高并發的問題。

首先根據架構分層把不同技術進行了一些分類,如下圖:

15389173004565d75662401

?

互聯網技術架構分層策略圖

接下來我會逐一解釋各個技術的大概原理和思路,供大家參考和學習:

一、互聯網層

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查詢操作,下面是淘寶最早的時候采用的讀寫分離策略:

1538917447019e4f1f8ac6c

?

讀寫分離示意圖

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開發人員提升自己,突破瓶頸,相信你來學習,會有提升和收獲。在這個群里會有你需要的內容? 朋友們請抓緊時間加入進來吧。

轉載于:https://my.oschina.net/u/3967312/blog/2223500

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281949.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET 采用 SkiaSharp 生成二維碼和圖形驗證碼及圖片進行指定區域截取方法實現

在最新版的 .NET 平臺中,微軟在逐步放棄 System.Drawing.Imaging ,給出的理由如下:System.Drawing命名空間對某些操作系統和應用程序類型有一些限制。在Windows, System.Drawing 依賴于GDI操作系統附帶的本機庫。 某些Windows SKU…

Linux運維人員必會開源運維工具體系

新手必會用深(8-15k)標記,老鳥必會深淺藍色(15-25K)標記操作系統:Centos,Ubuntu,Redhat,suse,Freebsd網站服務:nginx,apache,lighttpd,php,tomcat,resin數據 庫:MySQL,MariaDB,PostgreSQLDB中間件&#x…

unity讀取Text

sing UnityEngine;using System.Collections;using System.IO; //需要導入System.IO,主要使用它的File類public class TextTest : MonoBehaviour { private string Mytxt; //用來存放文本內容 void Start() { Mytxt ReadFile("C:\\Users\\Admin\\Desktop\\測試…

hibernate mysql 主從_MYSQL主從復制和寫分離

基礎篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

深入剖析Redis系列(五) - Redis數據結構之字符串

前言 字符串類型 是 Redis 最基礎的數據結構。字符串類型 的值實際可以是 字符串(簡單 和 復雜 的字符串,例如 JSON、XML)、數字(整數、浮點數),甚至是 二進制(圖片、音頻、視頻)&am…

全新升級的AOP框架Dora.Interception[6]: 框架設計和實現原理

本系列前面的五篇文章主要介紹Dora.Interception的編程模式以及對它的擴展定制,現在我們來聊聊它的設計和實現原理。目錄一、調用鏈抽象二、基于約定的攔截器定義三、基于調用上下文的依賴注入容器四、攔截器的提供五、調用鏈的構建六、方法攔截的實現原理七、依賴注…

activemq 安全連接

一、定義用戶組1.1 simpleAuthenticationPlugin通過在activemq.xml中配置用戶組<plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username"admin" password"password" groups"admins,publishers,consumer…

React Native在Android當中實踐(五)——常見問題

React Native在Android當中實踐&#xff08;一&#xff09;——背景介紹 React Native在Android當中實踐&#xff08;二&#xff09;——搭建開發環境 React Native在Android當中實踐&#xff08;三&#xff09;——集成到Android項目當中 React Native在Android當中實踐&#…

完成登錄與注冊頁面的前端

完成登錄與注冊頁面的HTMLCSSJS&#xff0c;其中的輸入項檢查包括&#xff1a; 用戶名6-12位 首字母不能是數字 只能包含字母和數字 密碼6-12位 注冊頁兩次密碼是否一致 JS&#xff1a; function fnLogin() {var uSer document.getElementById("user");var pAss do…

mysql505復位密碼_mysql5 如何復位根用戶密碼[官方文檔]

如何復位根用戶密碼如果你從未為MySQL設置根用戶密碼&#xff0c;服務器在以根用戶身份進行連接時不需要密碼。但是&#xff0c;建議你為每個賬戶設置密碼如果你以前設置了根用戶密碼&#xff0c;但卻忘記了該密碼&#xff0c;可設置新的密碼。下述步驟是針對Windows平臺的。在…

WPF效果第二百零一篇之實現合并單元格

早一段時間又一次出差青海省西寧市;回來又是總結又是各種瑣事,也沒顧得上去分享點東西;大周末的就在家分享一下,這二天再次基于ListBox實現的合并單元格的效果:1、ListBox嵌套ListBox的前臺布局:<ListBox ItemsSource"{Binding LCPListData}" x:Name"Manufac…

轉載 maven 詳解 http://www.cnblogs.com/binyue/p/4729134.html

--聲明規范 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--聲…

ASP.NET Core中使用EasyCaching作為緩存抽象層

簡介做后端開發&#xff0c;緩存應該是天天在用&#xff0c;很多時候我們的做法是寫個幫助類&#xff0c;然后用到的時候調用一下。這種只適合簡單層次的應用&#xff1b;一旦涉及到接口實現調整之類的&#xff0c;這種強耦合的做法很不合適。有些其他的功能又要去重復造輪子。…

mysql qps如何查看_mysql狀態查看 QPS/TPS/緩存命中率查看

運行中的mysql狀態查看對正在運行的mysql進行監控&#xff0c;其中一個方式就是查看mysql運行狀態。(1)QPS(每秒Query量)QPS Questions(or Queries) / uptimemysql > show global status like Question%;mysql > show global status like uptime%;(2)TPS(每秒事務量…

visual studio開啟多核編譯方法

先按http://blog.csdn.net/acaiwlj/article/details/50240625的方法進行了VS多線程的啟動。 原本以為按以下步驟設置就OK了&#xff0c;但是編譯中無意間發些了一個warning&#xff1a;“/Gm”與多處理不兼容&#xff1b;忽略 /MP 開關&#xff01;&#xff01;&#xff01;&am…

聊聊storm nimbus的LeaderElector

為什么80%的碼農都做不了架構師&#xff1f;>>> 序 本文主要研究一下storm nimbus的LeaderElector Nimbus org/apache/storm/daemon/nimbus/Nimbus.java public static void main(String[] args) throws Exception {Utils.setupDefaultUncaughtExceptionHandler();…

Android框架式編程之BufferKnife

BufferKnife作為框架式編程的重要組成部分&#xff0c;使用BufferKnife能夠極大的精簡View層面的代碼量&#xff0c;并為MVP/MVC方式提供輔助。 一、配置 compile com.jakewharton:butterknife:(insert latest version) annotationProcessor com.jakewharton:butterknife-compi…

如果我去深圳,你會見我嗎

▲圖/ 深圳夜景初次見易小姐&#xff0c;還是21年的春節回老家的時候。想來20年因為疫情沒有回家&#xff0c;家母幾次三番電話里頭表達的思念以及建議一些不靠譜的回家計劃&#xff0c;著實有些不忍&#xff0c;確實有似“兒行千里母擔憂”之理&#xff0c;索性拿著年假和加班…

CodeForces - 1059D(二分+誤差)

鏈接&#xff1a;CodeForces - 1059D 題意&#xff1a;給出笛卡爾坐標系上 n 個點&#xff0c;求與 x 軸相切且覆蓋了所有給出點的圓的最小半徑。 題解&#xff1a;二分半徑即可。判斷&#xff1a;假設當前二分到的半徑是 R &#xff0c;因為要和 x 軸相切&#xff0c;所以圓心…

pureref 平移用不了_關于參考圖管理神器 PureRef 的一些快捷鍵

PureRef 的一些快捷鍵 軟件下載&#xff1a;點擊這里控制(配合左鍵)窗口內鼠標左鍵     框選窗口邊鼠標左鍵     調整窗口大小鼠標中鍵 或 按住Alt     移動畫布鼠標滾輪 或 按住Z     縮放畫布按住S     查看目標位置顏色信息(可復制16進制顏色…