高併發的那些事

本文是本身的總結文章,曾在CSDN官網公衆號上發表。web

"高併發"對後臺開發同窗來講,既熟悉又陌生。熟悉是由於面試和工做常常會說起它。陌生的起因是服務器因高併發致使出現各位問題的狀況少之又少。同時,想收穫這方面的經驗也是"摸着石頭過河", 須要大量學習理論知識,再去探索。面試

若是是客戶端開發的同窗,字典中是沒有「高併發」這個名詞。這驗證一句老話,"隔行如隔山"。客戶端開發,特別是手機應用開發,更多地是考慮如何優化應用的性能,下降 App 的卡頓率等。編程

本文是一篇科普文,分享本身近來學到的知識。緩存

什麼是高併發?

因爲分佈式系統的問世,高併發(High Concurrency)一般是指經過設計保證系統可以同時並行處理不少請求。通俗來說,高併發是指在同一個時間點,有不少用戶同時的訪問同一 API 接口或者 Url 地址。它常常會發生在有大活躍用戶量,用戶高彙集的業務場景中。服務器

其實,高併發也離咱們的生活並不遙遠,例如大學學校的選課系統。一到選課的時候,一大批學生同時選課,致使系統出現「不良反應」;再如淘寶的 618 和 雙 11 的購物活動;遇到節假日,12306 上演的「搶票大戰」。另外,DDos 攻擊也能算高併發的場景。微信

高併發會來帶的後果

  • 服務端: 高併發會致使站點服務器/DB服務器資源被佔滿崩潰,甚至出現服務器宕機的狀況;數據的存儲不完整,數據更新異常問題。
  • 用戶端: 服務端的問題是高併發的直接反饋,而客戶端是間隔反饋。它反饋給用戶狀況是糟糕的體驗。

提升系統併發能力的方式

在這個「雲」的時代,提升分佈式系統併發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)水平擴展(Scale Out)網絡

  1. 垂直擴展 提高單機處理能力。垂直擴展的方式又有兩種:
  • 加強單機硬件性能,例如:增長 CPU 核數如 32 核,升級更好的網卡如萬兆,升級更好的硬盤如 SSD,擴充硬盤容量如 2T,擴充系統內存如 128G;數據結構

  • 提高單機架構性能,例如:使用 Cache 來減小 I/O 次數,使用異步來增長單服務吞吐量,使用無鎖數據結構來減小響應時間;架構

  1. 水平擴展 只要增長服務器數量,就能線性擴充系統性能。虛擬化技術的出現,讓水平擴展變得輕鬆且簡單。如今的雲主機幾乎是虛擬主機,而不是物理主機。這樣的話,線性擴充也就是分分鐘的事,前提是要有足夠的物理主機支撐。

高併發的三個經典問題

  • 單臺服務器最大併發併發

    單臺服務器最大併發問題,通常是指一臺服務器可以支持多少TCP併發鏈接.

    一種理論說法是受到端口號範圍限制。操做系統上端口號 1024 如下是系統保留的,從 1024-65535 是用戶使用的。因爲每一個TCP鏈接都要佔一個端口號,因此咱們最多能夠有 60000 多個併發鏈接。

    但實際上單機併發鏈接數確定要受硬件資源(內存、網卡)、網絡資源(帶寬)的限制。特別是網卡處理數據的能力,它是最大併發的瓶頸。

  • C10K併發鏈接問題

    C10K併發鏈接問題是指單機 1 萬個併發鏈接問題。如何突破單機性能侷限,是高性能網絡編程所必需要直面的問題。這些侷限和問題最先被 Dan Kegel 進行了概括和總結,並首次成系統地分析和提出解決方案,後來這種廣泛的網絡現象和技術侷限都被你們稱爲 C10K 問題 。

    C10K問題本質上是操做系統的問題。對於 Web1.0/2.0 時代的操做系統而言, 傳統的同步阻塞 I/O 模型都是同樣的,處理的方式都是 requests per second,併發 10K 和 100 的區別關鍵在於CPU。

    建立的進程線程多了,數據拷貝頻繁(緩存I/O、內核將數據拷貝到用戶進程空間、阻塞), 進程/線程上下文切換消耗大, 致使操做系統崩潰,這就是C10K問題的本質!

  • C10M併發鏈接問題

    回顧了過去的10年裏,咱們面臨高性能網絡編程領域著名的C10K問題,最終也成功提出解決方案。下一個10年,是時候考慮C10M併發問題了。 C10M 併發鏈接問題指的是單機服務器實現 C10M(即單機千萬併發鏈接)。

Django 與高併發的聯繫

想弄清楚這個問題,首先要了解下 Django 在服務器中所處的位置。

上圖中講到 Django 應用服務器能夠分爲三層:

  • Web 框架層 Web框架層就是咱們開發出來的 Django Web 應用程序。它負責處理 HTTP 請求的動態數據。

  • WSGI 層 WSGI 不是用於與程序交互的API,也不是真實的代碼,WSGI 只是一種接口。它只適用於 Python 語言,其全稱爲 Web Server Gateway Interface。其定義了 web服務器和 web應用之間的接口規範。

  • Web 服務器層 Web 服務層做用是主要是接收 HTTP 請求並返回響應。常見的 web服務器有 Nginx,Apache,IIS等。

    特別是 Nginx, 它的出現是爲了解決 C10K 問題。Nginx 依靠異步事件驅動架構來幫助其處理大量的併發會話,因爲其對資源的輕量利用和伸縮自如的特性,它成爲了廣受歡迎的 web 服務器。

Django 框架注重的數據交互。因此考慮的問題是 Django 適不適合於高併發的場景。 它是一個通過大型網站規模驗證的框架。Instagram 支撐上億日活,因此 Django 能適用於高併發場景。因此不是想着 Django 框架能支撐到多大的併發量,而是咱們想要抗住很大的併發量,怎麼優化現有框架。

本文原創發佈於微信公衆號「極客猴」,歡迎關注第一時間獲取更多原創分享

相關文章
相關標籤/搜索