可伸縮架構簡短系列

2021-08-02 04:39:49 字數 1801 閱讀 2594

採取什麼辦法可以讓乙個web服務可大規模可擴充套件?相信你會對這個問題感興趣。

通常來說,公共伺服器上的乙個可伸縮的web服務總是隱藏在乙個load balancer(負載均衡器)之後。這個負載均衡器會將負載(來自使用者的請求)均勻的分配到一組伺服器或者伺服器集群。那意味著什麼?舉個例子:某個使用者訪問你的服務,他第一次的請求可能會由第二台伺服器提供,第二次請求由第9臺伺服器提供,第3次請求又再次由第二台伺服器提供。

對於該使用者而言,他每次得到的結果應該是一樣的,不依賴服務到底是哪台伺服器提供的。這個正是可伸縮性的第乙個**法則:每個伺服器都包含完全相同的**庫,不在本地磁碟或記憶體儲存任何與使用者相關的資料,如session或使用者資訊。session需要集中儲存,使得每一台伺服器都可以訪問到它。它可以是乙個外部資料庫或外部持久快取,比如redis。相比外部資料庫,在持久化的快取中存放session將會有更好的效能。這裡提到的「外部」指的是資料儲存不放置在這些應用伺服器上,而是在接近您的應用程式伺服器的資料中心。

但是這要怎麼部署呢?你如何確定當應用**發生了改變能夠傳送到所有的伺服器而沒有一台伺服器依舊使用之前的**?幸運的是,這個棘手的問題已經被乙個很好的工具capistrano解決了,你需要稍微學習了解下。

在解決了session和多台伺服器上新版本的同步更新問題之後,你需要做的就是轉殖你的機器映象了,然後將你最新的**部署上去。可以參考amazon提供的ami服務(amazon machine image)

現在你的伺服器可以水平擴充套件,並且處理成千上萬的併發請求了。

但是你發現應用程式變得越來越來最終崩潰。問題的原因:是mysql,不是嗎?

現在不是增加更多的機器可以解決的問題了,你有兩種辦法:

現在,你的資料庫有了乙個可擴充套件的解決方案了,你再也不用擔心儲存tb級的資料,世界看起來那麼的美好。

當大量的資料請求發往到資料庫,你發現又變慢了,解決辦法是增加快取。

這裡說的快取指的是記憶體快取,比如常見的記憶體資料庫memcached或者redis ,千萬不要使用檔案快取,它會讓你伺服器的轉殖和自動伸縮很痛苦。

但是回到記憶體快取,快取是乙個簡單的鍵值儲存並且應該介於應用程式和資料儲存。任何時候當你的應用程式需要去讀取資料時,它首先應該嘗試從快取裡面獲取資料,只有無法從快取中讀取資料時,才會嘗試從資料庫中讀到。為什麼要這麼做呢?因為快取快如閃電,它將資料集存放在記憶體中,並且可以快速的被處理。舉個例子:redis沒秒鐘可以處理成千上萬的讀操作。

訪問流程:第一次訪問綠色,第二次和之後的藍色:

有兩種快取資料的模式,一種是老的方式,一種是新的方式:

一些適合快取的物件:

2,回到麵包店,有的時候顧客可能會有一些特殊的需求,不然在麵包上加上「生日快樂」等裝飾。麵包店並不能提前知道這種顧客型別的需求,所以當顧客來到店裡後,必須馬上開啟乙個任務並且告訴他:」你明天再來吧!「 對於web而言,這意味著非同步任務。這裡有乙個典型的工作流:乙個使用者來到你的**,開始一項計算密集型任務,這個任務需要花費幾分鐘來完成,所以**前端會往任務佇列裡面傳送乙個任務,並且告訴使用者你的任務已經在處理中了,你可以繼續瀏覽網頁了。乙個任務佇列會不斷的被處理任務的workers 檢查處理。如果有乙個新任務,work會處理這個任務,過了幾分鐘之後會傳送乙個處理完畢的訊息訊號。前端會不斷的檢查(比如輪詢)這個任務是否已經處理完,一旦處理完則通知使用者。如果你想更深入了解,推薦你去看看rabbmitmq),rabbit mq是乙個實現了非同步訊息佇列的優秀中介軟體。你也可以使用activemq或者乙個簡單的redis list,非同步訊息佇列看起來很複雜,但是它值得你花時間去學習和實現。

如果你做一些耗時的操作,試著採用非同步。

可伸縮架構簡短系列

採取什麼辦法可以讓乙個web服務可大規模可擴充套件?相信你會對這個問題感興趣。通常來說,公共伺服器上的乙個可伸縮的web服務總是隱藏在乙個load balancer 負載均衡器 之後。這個負載均衡器會將負載 來自使用者的請求 均勻的分配到一組伺服器或者伺服器集群。那意味著什麼?舉個例子 某個使用者訪...

可伸縮架構簡短系列

通常來說,公共伺服器上的乙個可伸縮的web服務總是隱藏在乙個load balancer 負載均衡器 之後。這個負載均衡器會將負載 來自使用者的請求 均勻的分配到一組伺服器或者伺服器集群。那意味著什麼?舉個例子 某個使用者訪問你的服務,他第一次的請求可能會由第二台伺服器提供,第二次請求由第9臺伺服器提...

可伸縮架構簡短系列

採取什麼辦法可以讓乙個web服務可大規模可擴充套件?相信你會對這個問題感興趣。通常來說,公共伺服器上的乙個可伸縮的web服務總是隱藏在乙個load balancer 負載均衡器 之後。這個負載均衡器會將負載 來自使用者的請求 均勻的分配到一組伺服器或者伺服器集群。那意味著什麼?舉個例子 某個使用者訪...