抉擇:我的Web應(yīng)用該在哪種云服務(wù)上運(yùn)行?
當(dāng)開發(fā)了一個(gè)web應(yīng)用,或者準(zhǔn)備搭建一個(gè)網(wǎng)站,肯定要面對的一個(gè)問題是選擇一個(gè)服務(wù)器。
這里先不討論上個(gè)“時(shí)代”的玩法:虛擬主機(jī)、VPS。
今天我們考慮的是所謂的“云計(jì)算”,主流的方式有:
- IaaS (Infrastructure-as-a-Service) 基礎(chǔ)設(shè)施即服務(wù)。 模式是將虛擬機(jī)或者其他資源作為服務(wù)提供給用戶。代表有Amazon的EC2、DigitalOcean、Linode等。國內(nèi)提及的云主機(jī),比如阿里云的ECS、騰訊云主機(jī)等,主要也是這種模式。
- PaaS (Platform-as-a-Service) 平臺即服務(wù)。 模式是將一個(gè)開發(fā)平臺作為服務(wù)提供給用戶。代表有Google App Engine、Heroku、以及國內(nèi)的新浪SAE、百度BAE等。最近
- SaaS (Software-as-a-Service) 軟件即服務(wù)。 將應(yīng)用作為服務(wù)提供給客戶。代表有 Salesforce Sales Cloud、Google Apps、Zoho等。至于各種在線建站系統(tǒng)算不算呢?我覺得也算。
在這里其實(shí)對于開發(fā)者或者是大多數(shù)站長來講,我們關(guān)注的其實(shí)只是IaaS和PaaS,SaaS主要面向終端用戶。當(dāng)我們擁有自己的應(yīng)用代碼和獨(dú)立的網(wǎng)站時(shí),能作為我們提供程序運(yùn)行載體的服務(wù)主要也在IaaS和PaaS。所以我們暫且不討論SaaS。
那么我們說說IaaS和PaaS對于普通開發(fā)者和站長來講有什么切身的利益問題。
一、自由度
IaaS自由度更大。因?yàn)檫x擇IaaS服務(wù)你相當(dāng)于獲得一個(gè)全新的電腦系統(tǒng),在系統(tǒng)能力范圍內(nèi),你在這個(gè)系統(tǒng)上想怎么玩就怎么玩,當(dāng)你的應(yīng)用或網(wǎng)站需要經(jīng)過特別的配置優(yōu)化或者有自己獨(dú)特的運(yùn)行環(huán)境,那么IaaS或許是更好的選擇。比如Google的App Engine,作為一種PaaS服務(wù)它很長時(shí)間里只支持Java和Python,而且還需要通過配置文件去和它自己的運(yùn)行環(huán)境去適配,雖然變相便于選擇開發(fā)方向和對開發(fā)本身作出規(guī)范,但同時(shí)也是一種掣肘,你觸碰不到服務(wù)器的“底層”沒法隨意對它的運(yùn)作方式作出改動(dòng),你只能把焦點(diǎn)集中在代碼本身。
二、運(yùn)維壓力
PaaS的運(yùn)維壓力小很多。某種程度上甚至可以說運(yùn)維壓力約等于0。
這就是IaaS高自由度下的代價(jià)。因?yàn)樵贗aaS下,郵件服務(wù)、數(shù)據(jù)庫服務(wù)、文件傳輸服務(wù)等等都可能需要自己搭建,雖然也有一些第三方的服務(wù)可以去配置,但是也免不了需要安裝好基本的服務(wù)和語言環(huán)境,從這個(gè)意義上來講,“云”的優(yōu)勢里頭“便利”這一點(diǎn)得不到體現(xiàn),你還是得像“遠(yuǎn)古”那樣,具備 LAMP(Linux+Apache+MySQL+PHP)之類的知識,等花了老半天配置下來累得半死,網(wǎng)站還未必能順利跑起來。但PaaS通常只需要在服務(wù)后臺點(diǎn)擊一下,就能做項(xiàng)目的增刪改操作然后將項(xiàng)目代碼Push到服務(wù)平臺就了事。
事后的運(yùn)維更是大頭,比如數(shù)據(jù)備份和恢復(fù),萬一哪天服務(wù)環(huán)境出問題了,平時(shí)沒有備份那只能自認(rèn)倒霉,而如果你想換一臺機(jī)器或者更改服務(wù)方案,還有可能需要重走一系列的服務(wù)配置流程。
關(guān)鍵是,由于IaaS的性質(zhì)決定,它提供給你的是“基礎(chǔ)設(shè)施”(機(jī)器、系統(tǒng)),所以你在“基礎(chǔ)設(shè)施”上搭建的供應(yīng)用或網(wǎng)站運(yùn)行的“服務(wù)平臺”到底出了什么毛病是不歸它管的,這意味著為了保證你的東西能順利健康地運(yùn)行,你是需要自行投入到運(yùn)維工作中去的。
而PaaS提供給你的正是“服務(wù)平臺”,所以運(yùn)維壓力基本上落到了服務(wù)上身上了,因?yàn)樗鸫a要保證自己不出事。你只要管好你自己的代碼就行了。
三、性能
我們平常用IaaS服務(wù),可能一個(gè)虛擬機(jī)實(shí)例里會裝上各種語言的運(yùn)行環(huán)境用來運(yùn)行幾個(gè)網(wǎng)站,而PaaS則是以“容器”計(jì)算,一個(gè)容器其實(shí)就是一個(gè)虛擬機(jī),相當(dāng)于一個(gè)虛擬機(jī)就運(yùn)行一個(gè)網(wǎng)站。
那么問題來了:在同樣條件下(CPU、內(nèi)存、帶寬等)一個(gè)IaaS實(shí)例運(yùn)行3個(gè)不同語言環(huán)境的網(wǎng)站或者應(yīng)用,和用3個(gè)PaaS容器各自運(yùn)行應(yīng)用比較起來,誰的性能更強(qiáng)表現(xiàn)更好?
這個(gè)問題我暫時(shí)無解。尋找Docker(PaaS技術(shù))和KVM(IaaS技術(shù))性能比較,網(wǎng)上看了不少評論和資料也是眾所紛紜。雖然一般提到Docker都說“輕量、高性能、便捷性”是其優(yōu)點(diǎn),但是我沒有真正的有效地測試過。
不過一位目前專注于Docker開發(fā)的前輩有提過,Docker自己給出的結(jié)論是同樣條件下IaaS的性能還是比PaaS強(qiáng)——那么一丁點(diǎn)。
對這個(gè)問題有興趣的朋友不妨看看這個(gè)slideshow:KVM and Docker LXC benchmarking with openstack
我們從自由度、運(yùn)維壓力和性能的角度對 IaaS 和 PaaS 兩種云服務(wù)對web開發(fā)者的適用性進(jìn)行了PK。
下面我們將從便利性及遷移成本這兩個(gè)角度繼續(xù)探討“我的Web應(yīng)用或網(wǎng)站到底應(yīng)該在哪種云服務(wù)上運(yùn)行?”這個(gè)問題。
#p#
四、便利性
有一種說法,是Docker部署應(yīng)用“像點(diǎn)個(gè)按鈕一樣簡單。”其實(shí)對于一般人來說,真正應(yīng)驗(yàn)這句話的是PaaS服務(wù)(有些PaaS服務(wù)是建立在Docker基礎(chǔ)上的)。
做得好的PaaS在這點(diǎn)上是可以秒殺IaaS的。譬如GAE,當(dāng)你修改完代碼,用Google提供的軟件點(diǎn)一下按鈕就可以完成在本地測試和在云端運(yùn)行,你甚至都不需要去知道你的代碼是怎么傳上去的。
而IaaS基于上邊所說的有前后期的運(yùn)維壓力,你甚至在部署應(yīng)用之前得選擇你的服務(wù)器要安裝什么操作系統(tǒng)。
事實(shí)上現(xiàn)在PaaS服務(wù)主流的上傳方式還是有一點(diǎn)學(xué)習(xí)曲線的,比如你可能需要了解怎么用SVN或者GIT去更新和推送你的代碼到PaaS服務(wù)上,這個(gè)過程不比傳統(tǒng)FTP上傳來得簡單,但是本身SVN和GIT作為版本控制工具的諸多優(yōu)勢,是FTP不可比擬的,熟悉基本的使用后,一切就交給一兩句命令去完成。 而對于PaaS服務(wù)商來講,如何解決開發(fā)環(huán)境和生產(chǎn)環(huán)境里項(xiàng)目可能產(chǎn)生的差異是一個(gè)挑戰(zhàn)。比如你一個(gè)WordPress項(xiàng)目雖然通過GIT做到本地和云端的代碼一致,但是數(shù)據(jù)庫如何解決一致的問題?云端運(yùn)行的版本在線安裝了插件以及上傳了圖片等靜態(tài)文件上去,這種情況造成的差異問題如何解決?
五、遷移成本
對于有運(yùn)維基礎(chǔ)的人來說,IaaS比較保險(xiǎn),雖然麻煩一點(diǎn),但是畢竟要拿回文件和數(shù)據(jù)是分分鐘的事情。
PaaS……主要看服務(wù)商怎么做,程序代碼由于能做到云端和本地天然一致,自然沒問題,問題上面一條提到的靜態(tài)文件和數(shù)據(jù)怎么辦,而且即便都拿到了,能不能在另一個(gè)平臺順利運(yùn)行也是個(gè)問題。比如我當(dāng)年在GAE上運(yùn)行的網(wǎng)站在GAE被墻后基本上就宣告死亡了。這個(gè)問題上我建議即使選擇PaaS,也不要選擇服務(wù)太奇葩的,GAE的問題在于它的數(shù)據(jù)庫類型,幾乎在其他環(huán)境下沒法用。盡量選擇服務(wù)環(huán)境比較通用的。
總結(jié)
總的來講,IaaS是讓服務(wù)環(huán)境去適應(yīng)項(xiàng)目程序,你需要花精力去做運(yùn)維工作配置好適合的運(yùn)行環(huán)境;PaaS是讓項(xiàng)目程序去適應(yīng)服務(wù)環(huán)境,你需要限制程序開發(fā)的自由度按照PaaS服務(wù)的一定規(guī)范去開發(fā)你的項(xiàng)目。
我建議先看看備選的PaaS服務(wù)商提供的服務(wù)是否能滿足你項(xiàng)目正常運(yùn)行的需要,小型項(xiàng)目和需要快速上線的項(xiàng)目可以用PaaS快速部署看看效果,而使用常用CMS創(chuàng)建的網(wǎng)站,由于對運(yùn)行環(huán)境的定制要求不高,也特別適合用PaaS。 如果有后期優(yōu)化運(yùn)行環(huán)境需要或者程序不穩(wěn)定因素大的、有可能大改程序的,那么基于自由度的因素選擇IaaS或許更適合。