從咖啡館的經營看Web應用的擴充套件
譯註:這是一篇趣文,作者是Vistaprint的工程師Sriram Devadas,他用如何經營一家咖啡館作為例子來講解Web應用所面臨的擴充套件問題,文章生動有趣,講解淺顯易懂。
我經營著一家咖啡館。經營成本同所用的資源成正比。
我的咖啡館店面大概有一百平方英尺(約九平方米),僱傭了一個咖啡師,一臺咖啡機。
營業能力:
每次能夠服務一個顧客,用三分鐘泡製一杯咖啡,算下來服務一個顧客的總時間是五分鐘。
如果我的咖啡師不間斷的工作,並且所使用的德制咖啡機不會出問題,那麼我的咖啡館的接待量為每小時十二位顧客。
Web伺服器
高峰時期顧客很多,可是我們每次只能服務一位顧客,並且沒有等候區。
所以我升級了店面,新店很棒!
升級後配置:
同樣地店面面積,僱傭了三個咖啡師,購置了兩臺咖啡機並新增了兩張椅子。
營業能力:
三分鐘能夠泡製兩杯咖啡,約七分鐘能夠同時(Concurrent)服務三位顧客,並且還有兩位顧客可以在新加的椅子上排隊等待。
併發服務的顧客量=3,顧客接待量=5。
縱向擴充套件
新店大受歡迎,顧客絡繹不絕,所以我再次升級了店面,新店面更大!設施更好!
升級後配置:
兩百尺的店面,五位咖啡師,四臺咖啡機,三把椅子。
營業能力隨著投入的增加而變大,一切似乎都很美好。
然而隨著夏天的到來,也到了咖啡館經營的淡季。這時候由於經營成本的壓力,我想減少店面的配置。但是我的老闆不會讓我這麼幹。
由於業務的漲落,縱向擴充套件對於我和我的咖啡館而言代價有些過於昂貴了。有時候更大並不意味著更好。
通過業務量負載均衡進行橫向的擴充套件
經過商議,老闆同意以三個咖啡師為一組調整咖啡館資源的配置,如果我事先通知,他可以增加或減少這樣一組資源。
要是我能夠管理多個同樣配置的資源組…
是的,正好有這樣一種特殊的吧檯!這種吧檯允許一個咖啡師同時服務多個顧客,事實上為顧客服務的人並不一定非要是咖啡師,顧客只需要有人為他們下單就可以了,並且咖啡師也並不需要直接同這些難纏的顧客打交道。
所以我做出了改進。如果我有擴充套件業務的需求,我會額外僱傭三個咖啡師(老闆說OK),並且將他們放到哪個特殊的吧檯中,如果業務量下降,我就會解除僱傭合同,讓三位咖啡師撤出吧檯。
隨著投入的增加,店面的接待能力變得更強,同時營業能力可以動態調整。
資源密集型處理
我發現我的咖啡機非常全能,能夠製造各種食品。許多顧客建議我應該在選單中加上烤麵包,我就這麼做了。
這時候出現了一個問題:我所用的兩臺咖啡機需要花兩倍泡製咖啡的時間來烤一磅的麵包。
這麼算來,烤一磅麵包所花的時間等於泡製四杯咖啡所用的時間。
這樣一來,麵包訂單有的時候會阻塞整個系統!點咖啡的顧客很不滿,大家都在議論我的經營方式太低效。
我需要一個根據營業負載分流訂單的方法,使我的資源能夠優化的利用。
基於處理的非同步佇列
我發明了一種使用號牌的佇列系統。
顧客到來,點單之後會拿到一個號牌並等待。
訂單被分置於兩個輸入佇列中,分別是麵包和咖啡。
咖啡師根據目前兩個佇列以及店面資源的狀況選擇是響應咖啡訂單還是麵包訂單。
一旦咖啡或是麵包準備好了,會被放置於一個輸出托盤中,並且服務員會叫號,顧客會把東西端走。
- 雖然輸入佇列及輸出托盤是新加的,但是仍舊使用這些資源,只是說服務方式不同了。
- 投入和服務能力的計算很複雜,所以整個系統的複雜性也隨之增加了。所以如果這期間發生了問題,處理和解決將是很頭疼的。
- 如果顧客們能夠接受這種非同步的服務方式,並且我們能夠控制這麼複雜的系統,那我的咖啡館就能夠根據業務量擴充套件的同時還能提供多樣的服務種類。這足以嚇退那些競爭對手。
寫在最後
我們已經討論了Web伺服器、負載均衡以及基於佇列的非同步系統,那麼接下來呢?
我的咖啡館比喻已經可以結束了。
如果你真這些感興趣,去找找經典的系統擴充套件的例子看看,例如迴圈DNS或其他相關技術。
如果你在Web應用擴充套件方面還是新手,那麼先照著這篇文章中提到的方法先試試。
我所用的咖啡館模擬只是一個簡化的問題抽象,目的是描述Web應用擴充套件問題的精髓。
如果你真想學,那麼仔細琢磨下這些系統,並且找個有實際經驗並懂行的人討論一下,那會很有幫助。
原文連結: highscalability 翻譯: 伯樂線上 - 熊崽Kevin
相關文章
- 如何在AWS上自動擴充套件Web應用套件Web
- Web應用擴充套件系列(2):如何確定Web應用執行緒池的大小Web套件執行緒
- Django與微服務架構:構建可擴充套件的Web應用Django微服務架構套件Web
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- VSCode擴充套件應用VSCode套件
- easyui應用(四)--- easyui擴充套件UI套件
- 並查集擴充套件應用並查集套件
- plain framework的實際應用和擴充套件AIFramework套件
- 構建可擴充套件的應用(一) (轉)套件
- 深度解讀 OpenYurt:從邊緣自治看 YurtHub 的擴充套件能力套件
- 6個強大的AngularJS擴充套件應用AngularJS套件
- [譯]擴充套件 Node.js 應用套件Node.js
- Web儲存(Web Storage)擴充套件EStorageWeb套件
- 如何構建可控,可靠,可擴充套件的 PWA 應用套件
- chrome擴充套件應用開發快速科普Chrome套件
- iOS Extension擴充套件開啟宿主應用iOS套件
- 伸縮擴充套件Node.JS應用套件Node.js
- 使用Slice擴充套件伸縮OpenJPA 應用套件
- 通過exp突然增長看錶的擴充套件套件
- 基於web/h5應用的外掛/擴充套件/業務剝離方案設計WebH5套件
- ASP.NET MVC 5 Web程式設計3 -- Controller的應用及擴充套件ASP.NETMVCWeb程式設計Controller套件
- 5.4 多鏈:區塊鏈應用的擴充套件互動區塊鏈套件
- 使用View modification擴充套件SAP Fiori應用的一個案例View套件
- 關於一些nginx的高階擴充套件應用Nginx套件
- Minecraft中ScoreBoard的底層實現與擴充套件應用Raft套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- c# 高階應用 理解擴充套件方法C#套件
- 前端打包成桌面應用、以及chrome擴充套件前端Chrome套件
- Ruby Ruport實踐—Ruport::Formatter應用擴充套件ORM套件
- 智聯招聘的Web模組擴充套件落地方案Web套件
- 如何擴充套件大規模Web網站的效能?套件Web網站
- 實用的可選項(Optional)擴充套件套件
- Mac Safari上有趣實用的擴充套件Mac套件
- 正則的擴充套件套件
- SRAM的容量擴充套件套件
- 芯飛躍 看至強可擴充套件處理器的至強效應套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 表空間自動擴充套件 AUTOALLOCATE 的擴充套件規律套件