成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何為從1到10萬(wàn)用戶的應(yīng)用程序,設(shè)計(jì)不同的擴(kuò)展方案?

新聞 架構(gòu)
對(duì)于創(chuàng)業(yè)公司來(lái)說(shuō),有用戶注冊(cè)是好事情,但是當(dāng)用戶從零擴(kuò)展到成千上萬(wàn)之后,Web 應(yīng)用程序又該如何支持呢?

 [[318971]]

對(duì)于創(chuàng)業(yè)公司來(lái)說(shuō),有用戶注冊(cè)是好事情,但是當(dāng)用戶從零擴(kuò)展到成千上萬(wàn)之后,Web 應(yīng)用程序又該如何支持呢?

通常來(lái)說(shuō),這種情況的解決方案要么是來(lái)自突然爆發(fā)的緊急事件,要么是系統(tǒng)出現(xiàn)瓶頸進(jìn)行升級(jí)改造。雖然方式不同,但是我們也發(fā)現(xiàn)了,一個(gè)邊緣項(xiàng)目發(fā)展成高度可擴(kuò)展項(xiàng)目,其升級(jí)方案是有一些普適的“公式”可以套用,本文以 Graminsta 為例,為大家介紹當(dāng)用戶從 1 位發(fā)展到 10 萬(wàn),應(yīng)用程序如何擴(kuò)展?

1. 1 位用戶:1 臺(tái)機(jī)器

無(wú)論是網(wǎng)站還是移動(dòng)應(yīng)用,應(yīng)用程序幾乎都包括這三個(gè)關(guān)鍵組件:API、數(shù)據(jù)庫(kù)和客戶端,其中數(shù)據(jù)庫(kù)用來(lái)存儲(chǔ)持久數(shù)據(jù),API 服務(wù)于數(shù)據(jù)及與其有關(guān)的請(qǐng)求,而客戶端負(fù)責(zé)將數(shù)據(jù)呈現(xiàn)給用戶。

在現(xiàn)代應(yīng)用程序開(kāi)發(fā)中,客戶端往往會(huì)被視為一個(gè)獨(dú)立于 API 的實(shí)體,這樣一來(lái)就可以更輕松地?cái)U(kuò)展應(yīng)用程序了。

當(dāng)剛開(kāi)始構(gòu)建應(yīng)用程序時(shí),可以讓這三個(gè)組件都運(yùn)行在一個(gè)服務(wù)器上,類似于我們的開(kāi)發(fā)環(huán)境,一位工程師在同一臺(tái)計(jì)算機(jī)上運(yùn)行數(shù)據(jù)庫(kù)、API 和客戶端。

當(dāng)然,理論上我們可以把它部署到云上的單個(gè) DigitalOcean Droplet 或 AWS EC2 實(shí)例上,如下所示:

但是,當(dāng)我們的用戶未來(lái)不止 1 個(gè)的時(shí)候,其實(shí)剛開(kāi)始就應(yīng)該考慮是否要將數(shù)據(jù)層拆分出來(lái)。

2. 10 個(gè)用戶:拆分?jǐn)?shù)據(jù)層

拆分?jǐn)?shù)據(jù)層,并將其作為一個(gè)類似于 Amazon 的 RDS 或 Digital Ocean 的托管數(shù)據(jù)庫(kù)的托管服務(wù)。這樣做的話,雖然成本會(huì)比在一臺(tái)機(jī)器上或 EC2 實(shí)例上自托管高一些,但是我們可以獲得很多現(xiàn)成且方便的東西,例如多區(qū)域冗余、只讀副本、自動(dòng)備份等等。

Graminsta 現(xiàn)在的系統(tǒng)如下所示:

3. 100 個(gè)用戶:拆分客戶端

當(dāng)網(wǎng)站流量變得穩(wěn)定之后,就到了拆分客戶端的時(shí)候了。

需要注意的是,拆分實(shí)體是構(gòu)建可擴(kuò)展應(yīng)用程序的關(guān)鍵所在。當(dāng)系統(tǒng)中的某一部分獲得了更多流量,那么就應(yīng)該把它拆分出來(lái),根據(jù)其自身的特定流量模式來(lái)處理服務(wù)的擴(kuò)展。這也是我會(huì)把客戶端和 API 看作是相互獨(dú)立的組件的原因,這樣,我們就可以輕松為多平臺(tái)構(gòu)建產(chǎn)品,例如 web、移動(dòng) web、iOS、Android、桌面應(yīng)用、第三方服務(wù)等,它們都是使用相同 API 的客戶端。

現(xiàn)在,Graminsta 的系統(tǒng)如下所示:

4. 1000 個(gè)用戶:負(fù)載均衡器

當(dāng)新用戶越來(lái)越多,如果只有一個(gè) API 實(shí)例可能滿意滿足所有的流量,這時(shí)我們需要更多的計(jì)算能力。

這時(shí),負(fù)載均衡器該上場(chǎng)了,我們?cè)?API 前面添加一個(gè)負(fù)載均衡器,它會(huì)把流量路由到該服務(wù)的一個(gè)實(shí)例上,我們就可以進(jìn)行水平擴(kuò)展(通過(guò)添加更多運(yùn)行相同代碼的服務(wù)器來(lái)增加可以處理的請(qǐng)求數(shù)量)。

我們?cè)?web 端和 API 前面添加了一個(gè)獨(dú)立的負(fù)載均衡器,這意味著我們擁有了多個(gè)運(yùn)行 API 和 web 客戶端代碼的實(shí)例。該負(fù)載均衡器會(huì)把請(qǐng)求路由到任何一個(gè)流量最小的實(shí)例上。并且,我們還可以從中得到冗余,當(dāng)一個(gè)實(shí)例宕機(jī)(過(guò)載或崩潰)時(shí),其他實(shí)例還可以繼續(xù)運(yùn)行,響應(yīng)傳入的請(qǐng)求,而不是整個(gè)系統(tǒng)宕機(jī)。

負(fù)載均衡器還支持自動(dòng)擴(kuò)展,在流量高峰時(shí)可以增加實(shí)例的數(shù)量,當(dāng)流量低谷時(shí),減少實(shí)例數(shù)量。借助負(fù)載均衡器,API 層實(shí)際上可以無(wú)限擴(kuò)展,如果請(qǐng)求增加,我們只需要不斷增加實(shí)例就可以了。

如何为从1到10万用户的应用程序,设计不同的扩展方案?

編者注:到目前為止,我們擁有的產(chǎn)品和 PaaS 公司(如 Heroku 或 AWS 的 Elastic Beanstalk)提供的開(kāi)箱即用產(chǎn)品非常類似。Heroku 把數(shù)據(jù)庫(kù)托管在單獨(dú)的主機(jī)上,用自動(dòng)擴(kuò)展來(lái)管理負(fù)載均衡器,并允許我們把 API 和 web 客戶端分開(kāi)托管。對(duì)于早期初創(chuàng)企業(yè)來(lái)說(shuō),使用 Heroku 等服務(wù)來(lái)做項(xiàng)目是一個(gè)不錯(cuò)的選擇,所有必需的、基本的東西都是開(kāi)箱即用。

5. 10000 個(gè)用戶:CDN

對(duì)于 Graminsta 來(lái)說(shuō),處理和上傳圖像為服務(wù)器帶來(lái)了很大的負(fù)擔(dān)。所以,Graminsta 選擇了使用云存儲(chǔ)服務(wù)來(lái)托管靜態(tài)內(nèi)容,例如圖像、視頻等(AWS 的 S3 或 Digital Ocean 的 Spaces),而 API 應(yīng)該避免圖像處理和圖像等業(yè)務(wù)。

另外,使用云存儲(chǔ)服務(wù),我們還可以使用 CDN,可以在遍布全球不同的數(shù)據(jù)中心自動(dòng)緩存圖像。我們的主數(shù)據(jù)中心可能托管在

我們從云存儲(chǔ)服務(wù)得到的另一樣?xùn)|西是 CDN(在 AWS,這是一個(gè)被稱為 Cloudfront 的插件,但是很多云存儲(chǔ)服務(wù)都以開(kāi)箱即用的方式提供它)。CDN 將在遍布全球不同的數(shù)據(jù)中心自動(dòng)緩存我們的圖像。

雖然我們的主數(shù)據(jù)中心可能托管在俄亥俄州,如果有人在日本對(duì)圖像發(fā)出了請(qǐng)求,那么云供應(yīng)商就會(huì)進(jìn)行復(fù)制,將其存儲(chǔ)在位于日本的數(shù)據(jù)中心,下一個(gè)請(qǐng)求該圖像的日本用戶就會(huì)很快收到圖像。

如何为从1到10万用户的应用程序,设计不同的扩展方案?

6. 10 萬(wàn)個(gè)用戶:擴(kuò)展數(shù)據(jù)層

負(fù)載均衡器在環(huán)境中添加了 10 個(gè) API 實(shí)例,使得 API 的 CPU 和內(nèi)存消耗都很低,CDN 幫助我們解決了世界各地圖像請(qǐng)求的問(wèn)題。但是現(xiàn)在,我們有一個(gè)問(wèn)題需要解決,那就是請(qǐng)求延遲。

通過(guò)研究,我們發(fā)現(xiàn)數(shù)據(jù)庫(kù) CPU 的消耗占比達(dá)到了 80%-90%,因此擴(kuò)展數(shù)據(jù)層成為了當(dāng)務(wù)之急。數(shù)據(jù)層的擴(kuò)展是一件很棘手的事情,雖然對(duì)于服務(wù)無(wú)狀態(tài)請(qǐng)求的 API 服務(wù)器來(lái)說(shuō),只需要添加更多實(shí)例即可,但是對(duì)于大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),卻不是這樣。

緩存

要從數(shù)據(jù)庫(kù)獲得更多信息的最簡(jiǎn)單方法之一是給系統(tǒng)引入一個(gè)新的組件:緩存層。實(shí)現(xiàn)緩存最常用的方法是使用內(nèi)存中的鍵值存儲(chǔ)(如 Redis 或 Memcached),且大多數(shù)云廠商都會(huì)提供數(shù)據(jù)庫(kù)服務(wù)的托管版本。

當(dāng)該服務(wù)正在進(jìn)行對(duì)數(shù)據(jù)庫(kù)相同信息的大量重復(fù)調(diào)用時(shí),就是緩存大顯身手的時(shí)候了。當(dāng)我們?cè)L問(wèn)數(shù)據(jù)庫(kù)一次時(shí),緩存就會(huì)保存信息,之后再進(jìn)行相同請(qǐng)求時(shí),就不必再訪問(wèn)數(shù)據(jù)庫(kù)了。

例如,如果有人想在 Graminsta 中訪問(wèn) Mavid Mobrick 的個(gè)人資料頁(yè)面時(shí),我們把從數(shù)據(jù)庫(kù)中得到的結(jié)果,緩存在 Redis 中關(guān)鍵字 user:id 下,到期時(shí)間為 30 秒。之后,每當(dāng)有人訪問(wèn) Mavid Mobrick 的個(gè)人資料時(shí),我們會(huì)首先查看 Redis,如果存在相關(guān)資料,那就直接從 Redis 提供數(shù)據(jù)。

大多數(shù)緩存服務(wù)的另一個(gè)優(yōu)點(diǎn)是,與數(shù)據(jù)庫(kù)相比,更容易擴(kuò)展。Redis 有個(gè)內(nèi)建的 Redis 集群(Redis Cluster)模式,用的是跟負(fù)載均衡器類似的方式,可以把我們的 Redis 緩存分布到多臺(tái)機(jī)器上 。

所有高度擴(kuò)展的應(yīng)用程序幾乎都充分利用了緩存的優(yōu)勢(shì),緩存是構(gòu)建快速 API 不可或缺的部分,可以提供更好的查詢和更高效的代碼,如果沒(méi)有緩存,我們可能很難擴(kuò)展到數(shù)百萬(wàn)用戶的規(guī)模。

只讀副本

由于對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)相當(dāng)多,因此我們需要在數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)添加只讀副本。借助上面提到的托管服務(wù),只需要點(diǎn)擊一下就可以完成。只讀副本將和主數(shù)據(jù)庫(kù)保持一致,并且能夠用于 SELECT 語(yǔ)句。

如何为从1到10万用户的应用程序,设计不同的扩展方案?

7. 未來(lái)展望

隨著應(yīng)用的不斷擴(kuò)展,我們會(huì)把重點(diǎn)放在拆分獨(dú)立擴(kuò)展的服務(wù)。例如,如果我們使用了 websockets,那么會(huì)把 websockets 處理代碼抽取出來(lái),放在新的實(shí)例上,同時(shí)安裝負(fù)載均衡器。該負(fù)載均衡器可以根據(jù) websocket 連接打開(kāi)或關(guān)閉的數(shù)量來(lái)上下擴(kuò)展,與我們收到的 HTTP 請(qǐng)求數(shù)量無(wú)關(guān)。

如果未來(lái)還會(huì)遇到數(shù)據(jù)層的限制,我們就會(huì)對(duì)數(shù)據(jù)庫(kù)進(jìn)行分區(qū)和分片。

我們會(huì)使用 New Relic 或 Datadog 等服務(wù)安裝監(jiān)控程序,并通過(guò)監(jiān)控程序發(fā)現(xiàn)比較慢的請(qǐng)求,改進(jìn)它。同時(shí),隨著擴(kuò)展的不斷進(jìn)行,我們希望能夠發(fā)現(xiàn)更多的瓶頸并解決它。

 

責(zé)任編輯:張燕妮 來(lái)源: 架構(gòu)頭條
相關(guān)推薦

2018-08-16 09:55:46

卸載windows 10應(yīng)用程序

2022-09-01 11:21:06

擴(kuò)展惡意代碼

2019-04-16 09:40:12

服務(wù)器系統(tǒng)數(shù)據(jù)庫(kù)

2012-07-04 09:28:41

我查查推廣運(yùn)營(yíng)Mary

2022-09-05 11:25:22

惡意瀏覽器Chrome惡意擴(kuò)展

2009-07-31 16:21:05

ibmdwAPI

2019-04-04 09:59:06

服務(wù)器系統(tǒng)Web

2011-02-22 14:42:52

AndroidPad

2025-06-05 09:50:50

2021-02-23 23:06:31

數(shù)據(jù)庫(kù)Redis技術(shù)

2021-11-26 21:38:44

JavaScript框架開(kāi)發(fā)

2010-08-04 09:34:51

Flex設(shè)計(jì)

2010-05-04 22:32:37

手機(jī)木馬網(wǎng)絡(luò)安全360手機(jī)衛(wèi)士

2011-01-19 11:10:50

程序交付優(yōu)化應(yīng)用程序性能管理監(jiān)控

2020-09-18 07:00:00

Kubernetes應(yīng)用程序架構(gòu)

2024-12-30 13:05:22

2020-09-04 14:56:23

應(yīng)用程序疫情

2020-12-28 14:40:47

云計(jì)算云應(yīng)用SaaS

2015-01-06 09:59:59

云應(yīng)用程序Java開(kāi)發(fā)SQL

2021-04-15 07:53:15

ParkMobile數(shù)據(jù)泄露網(wǎng)絡(luò)犯罪
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 女人毛片a毛片久久人人 | 免费在线看a | 欧美精品片 | 一区二区三区国产 | 日韩成人在线视频 | h肉视频 | 成人三级在线观看 | 国产不卡在线 | 亚洲最新在线视频 | 国产精品久久久久久吹潮 | 日韩国产一区二区三区 | 性色av一区| 午夜免费观看网站 | 北条麻妃一区二区三区在线视频 | 成人精品一区二区 | 久久高清亚洲 | 欧美一级特黄aaa大片在线观看 | 欧美456 | 成人1区2区| 91免费观看视频 | 一区二区三区免费 | 国产伦精品一区二区三区精品视频 | 久久免费看 | 色综合一区二区三区 | 国产激情一区二区三区 | 精品国产免费一区二区三区五区 | 国产欧美在线观看 | 日韩电影免费在线观看中文字幕 | 久艹av | 天天射影院 | 国内精品伊人久久久久网站 | 成人免费xxxxx在线视频 | 98成人网 | 亚洲视频 欧美视频 | 欧美xxxx网站| 欧美中文字幕一区二区三区亚洲 | 国产欧美在线 | 久久国产精品亚洲 | 九九热精品在线 | 久久国产美女视频 | 天天操天天射天天舔 |