採起什麼辦法可讓一個Web服務可大規模可擴展?相信你會對這個問題感興趣。前端
一般來講,公共服務器上的一個可伸縮的web服務老是隱藏在一個Load Balancer(負載均衡器)以後。這個負載均衡器會將負載(來自用戶的請求)均勻的分配到一組服務器或者服務器集羣。那意味着什麼?舉個例子:某個用戶訪問你的服務,他第一次的請求可能會由第二臺服務器提供,第二次請求由第9臺服務器提供,第3次請求又再次由第二臺服務器提供。git
對於該用戶而言,他每次獲得的結果應該是同樣的,不依賴服務究竟是哪臺服務器提供的。這個正是可伸縮性的第一個黃金法則:每一個服務器都包含徹底相同的代碼庫,不在本地磁盤或內存存儲任何與用戶相關的數據,如session或用戶信息。Session須要集中存儲,使得每一臺服務器均可以訪問到它。它能夠是一個外部數據庫或外部持久緩存,好比Redis。相比外部數據庫,在持久化的緩存中存放session將會有更好的性能。這裏提到的「外部」指的是數據存儲不放置在這些應用服務器上,而是在接近您的應用程序服務器的數據中心。github
可是這要怎麼部署呢?你如何肯定當應用代碼發生了改變可以發送到全部的服務器而沒有一臺服務器依舊使用以前的代碼?幸運的是,這個棘手的問題已經被一個很好的工具capistrano解決了,你須要稍微學習瞭解下。web
在解決了session和多臺服務器上新版本的同步更新問題以後,你須要作的就是克隆你的機器鏡像了,而後將你最新的代碼部署上去。能夠參考Amazon提供的AMI服務(Amazon Machine Image)redis
如今你的服務器能夠水平擴展,而且處理成千上萬的併發請求了。數據庫
可是你發現應用程序變得愈來愈來最終崩潰。問題的緣由:是MySql,不是嗎?
如今不是增長更多的機器能夠解決的問題了,你有兩種辦法:apache
如今,你的數據庫有了一個可擴展的解決方案了,你不再用擔憂存儲TB級的數據,世界看起來那麼的美好。api
當大量的數據請求發往到數據庫,你發現又變慢了,解決辦法是增長緩存。
這裏說的緩存指的是內存緩存,好比常見的內存數據庫Memcached或者Redis ,千萬不要使用文件緩存,它會讓你服務器的克隆和自動伸縮很痛苦。緩存
可是回到內存緩存,緩存是一個簡單的鍵值存儲而且應該介於應用程序和數據存儲。任什麼時候候當你的應用程序須要去讀取數據時,它首先應該嘗試從緩存裏面獲取數據,只有沒法從緩存中讀取數據時,纔會嘗試從數據庫中讀到。爲何要這麼作呢?由於緩存快如閃電,它將數據集存放在內存中,而且能夠快速的被處理。舉個例子:Redis沒秒鐘能夠處理成千上萬的讀操做。服務器
訪問流程:第一次訪問綠色,第二次和以後的藍色:
有兩種緩存數據的模式,一種是老的方式,一種是新的方式:
一些適合緩存的對象:
請想象一下,你想在你最喜歡的麪包店買麪包,因此你走進麪包店,向一個店員詢問購買麪包,可是麪包都賣光了。你被告知2個小時以後你訂的麪包能夠好,這個很惱人,不是嗎?
爲了不這種「請等片刻」的場景,須要採起異步。好比何時有面包了,店員會將麪包派送給你的家裏。一般來講,有兩種異步的範例:
若是你作一些耗時的操做,試着採用異步。