通過前面兩篇介紹,大家應(yīng)該對Google強大的基礎(chǔ)設(shè)施有一定的了解。本篇開始介紹構(gòu)筑在這強大基礎(chǔ)設(shè)施之上的Google App Engine。 Google App Engine的介紹由于發(fā)布S3和EC2這兩個優(yōu)秀的云服務(wù),使得Amazon已經(jīng)率先在云計算市場站穩(wěn)了腳跟,而身為云計算這個浪潮的發(fā)起者之一的Google肯定不甘示弱,并在2008年四月份推出了Google App Engine這項PaaS服務(wù),雖然現(xiàn)在無法稱其為一個革命性的產(chǎn)品,但肯定是現(xiàn)在市面上最成熟,并且功能最全面的PaaS平臺。 Google App Engine 提供一整套開發(fā)組件來讓用戶輕松地在本地構(gòu)建和調(diào)試網(wǎng)絡(luò)應(yīng)用,之后能讓用戶在Google強大的基礎(chǔ)設(shè)施上部署和運行網(wǎng)絡(luò)應(yīng)用程序,并自動根據(jù)應(yīng)用所承受的負(fù)載來對應(yīng)用進(jìn)行擴(kuò)展,并免去用戶對應(yīng)用和服務(wù)器等的維護(hù)工作。同時提供大量的免費額度和靈活的資費標(biāo)準(zhǔn)。在開發(fā)語言方面,現(xiàn)支持Java和 Python這兩種語言,并為這兩種語言提供基本相同的功能和API。 功能 在功能上,主要有六個方面:
使用流程 整個使用流程主要包括五個步驟:
由于本系列是專注于GAE的實現(xiàn)和設(shè)計兩方面,所以不會對GAE的使用有非常深入地介紹,如果希望大家對GAE的使用方面有更深的理解,具體可以參看一下GAE的官方文檔。 Google App Engine的主要組成部分 主要可分為五部分:
應(yīng)用服務(wù)器 應(yīng)用服務(wù)器依據(jù)其支持語言的不同而有不同的實現(xiàn)。 Python的實現(xiàn) Python版應(yīng)用服務(wù)器的基礎(chǔ)就是普通的Python 2.5.2版的Runtime,并考慮在在未來版本中添加對Python 3的支持,但是因為Python 3對Python而言,就好比Java2之于Java1,跨度非常大,所以引入Python3的難度很大。在Web技術(shù)方面,支持諸如 Django,CherryPy,Pylons和Web2py等Python Web框架,并自帶名為“WSGI”的CGI框架。雖然Python版應(yīng)用服務(wù)器是基于標(biāo)準(zhǔn)的Python Runtime,但是為了安全并更好地適應(yīng)App Engine的整體架構(gòu),對運行在應(yīng)用服務(wù)器內(nèi)的代碼設(shè)置了很多方面的限制,比如不能加載用C編寫Python模塊和無法創(chuàng)建Socket等。 Java的實現(xiàn) 在實現(xiàn)方面,Java版應(yīng)用服務(wù)器和Python版基本一致,也是基于標(biāo)準(zhǔn)的Java Web容器,而且選用了輕量級的Jetty技術(shù),并跑在Java 6上。通過這個Web容器不僅能運行常見的Java Web 技術(shù),包括Servlet,JSP,JSTL和GWT等,而且還能跑大多數(shù)常用的Java API(App Engine有一個The JRE Class White List來定義那些Java API能在App Engine的環(huán)境中被使用)和一些基于JVM的腳本語言,例如JavaScript,Ruby或Scala等,但同樣無法創(chuàng)建Socket和 Thread,或者對文件進(jìn)行讀寫,也不支持一些比較高階的API和框架,包括JDBC,JSF,Struts 2,RMI,JAX-RPC和Hibernate等。 Datastore提供了一整套強大的分布式數(shù)據(jù)存儲和查詢服務(wù),并能通過水平擴(kuò)展來支撐海量的數(shù)據(jù)。但Datastore并不是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,它主要以“Entity”的形式存儲數(shù)據(jù),一個Entity包括一個Kind(在概念上和數(shù)據(jù)庫的Table比較類似)和一系列屬性。 Datastore提供強一致性和樂觀(optimistic)同步控制,而在事務(wù)方面,則支持本地事務(wù),也就是在只能同一個Entity Group內(nèi)執(zhí)行事務(wù)。 在接口方面,Python版提供了非常豐富的接口,而且還包括名為GQL的查詢語言,而Java版則提供了標(biāo)準(zhǔn)的JDO和JPA這兩套API。 而且Google已經(jīng)在今年的Google I/O大會上宣布將在未來的App Engine for Business套件中包含標(biāo)準(zhǔn)的SQL數(shù)據(jù)庫服務(wù),但現(xiàn)在還不確定這個SQL數(shù)據(jù)庫的實現(xiàn)方式,是基于開源的MySQL技術(shù),還是基于其私有的實現(xiàn),這是一個問題。 服務(wù) Memcache Memcache是大中型網(wǎng)站所備的服務(wù),主要用來在內(nèi)存中存儲常用的數(shù)據(jù),而App Engine也包含了這個服務(wù)。有趣的是App Engine的Memcache也是由Brad Fitzpatrick開發(fā)。 URL抓取(Fetch) App Engine的應(yīng)用可以通過URL抓取這個服務(wù)抓取網(wǎng)上的資源,并可以這個服務(wù)來與其他主機(jī)進(jìn)行通信。這樣避免了應(yīng)用在Python和Java環(huán)境中無法使用Socket的尷尬。 App Engine應(yīng)用使用這個服務(wù)來利用Gmail的基礎(chǔ)設(shè)施來發(fā)送電子郵件。
計劃服務(wù)允許應(yīng)用在指定時間或按指定間隔執(zhí)行其設(shè)定的任務(wù)。這些任務(wù)通常稱為Cron job。 圖形 App Engine 提供了使用專用圖像服務(wù)來操作圖像數(shù)據(jù)的功能。圖像服務(wù)可以調(diào)整圖像大小,旋轉(zhuǎn)、翻轉(zhuǎn)和裁剪圖像。它還能夠使用預(yù)先定義的算法提升圖片的質(zhì)量。 用戶認(rèn)證 App Engine的應(yīng)用可以依賴Google帳戶系統(tǒng)來驗證用戶。App Engine還將支持OAuth。 XMPP
任務(wù)隊列(Task Queue) App Engine應(yīng)用能通過在一個隊列插入任務(wù)(以Web Hook的形式)來實現(xiàn)后臺處理,而且App Engine會根據(jù)調(diào)度方面的設(shè)置來安排這個隊列里面的任務(wù)執(zhí)行。 Blobstore 因為Datastore最多支持存儲1MB大小的數(shù)據(jù)對象,所以App Engine推出了Blobstore服務(wù)來存儲和調(diào)用那些大于1MB但小于2G的二進(jìn)制數(shù)據(jù)對象。 Mapper Mapper可以認(rèn)為就是“Map Reduce”中的Map,也就是能通過Mapper API對大規(guī)模的數(shù)據(jù)進(jìn)行平行的處理,這些數(shù)據(jù)可以存儲在Datastore或者Blobstore,但這個功能還處于內(nèi)部開發(fā)階段。 Channel 其實Channel就是我們常說的“Comet”,通過Channel API能讓應(yīng)用將內(nèi)容直接推至用戶的瀏覽器,而不需常見的輪詢。
除了Java版的Memcache,Email和URL抓取都是采用標(biāo)準(zhǔn)的API之外,其他服務(wù)無論是Java版還是Python版,其API都是私有的,但是提供了豐富和細(xì)致的文檔來幫助用戶使用。 管理界面 用了讓用戶更好地管理應(yīng)用,Google提供了一整套完善的管理界面,地址是http://appengine.google.com/ ,而且只需用戶的Google帳戶就能登錄和使用。下圖為其截屏: 使用這個管理界面可執(zhí)行許多操作,包括創(chuàng)建新的應(yīng)用程序,為這個應(yīng)用設(shè)置域名,查看與訪問數(shù)據(jù)和錯誤相關(guān)的日志,觀察主要資源的使用狀況。 本地開發(fā)環(huán)境 為了安全起見,本地開發(fā)環(huán)境采用了沙箱(Sandbox)模式,基本上和上面提到的應(yīng)用服務(wù)器的限制差不多,比如無法創(chuàng)建Socket和 Thread,也無法對文件進(jìn)行讀寫。Python版App Engine SDK是以普通的應(yīng)用程序的形式發(fā)布,本地需要安裝相應(yīng)的Python Runtime,通過命令行方式啟動Python版的Sandbox,同時也可以在安裝有PyDev插件的Eclipse上啟動。Java版App Engine SDK是以Eclispe Plugin形式發(fā)布,只要用戶在他的Eclipse上安裝這個Plugin,用戶就能啟動本地Java沙箱來開發(fā)和調(diào)試應(yīng)用。 編程模型 因為App Engine主要為了支撐Web應(yīng)用而存在,所以Web層編程模型對于App Engine也是最關(guān)鍵的。App Engine主要使用的Web模型是CGI,CGI全稱為“Common Gateway Interface”,它的意思非常簡單,就是收到一個請求,起一個進(jìn)程或者線程來處理這個請求,當(dāng)處理結(jié)束后這個進(jìn)程或者線程自動關(guān)閉,之后是不斷地重復(fù)這個流程。由于CGI這種方式每次處理的時候,都要重新起一個新的進(jìn)程或者線程,可以說在資源消耗方面還是很厲害的,雖然有線程池(Thread Pool)這樣的優(yōu)化技術(shù)。但是由于CGI在架構(gòu)上的簡單性使其成為GAE首選的編程模型,同時由于CGI支持無狀態(tài)模式,所以也在伸縮性方面非常有優(yōu)勢。而且App Engine的兩個語言版本都自帶一個CGI框架:在Python平臺為WSGI。在Java平臺則為經(jīng)典的Servlet。最近,由于App Engine引入了計劃任務(wù)和任務(wù)隊列這兩個特性,所以App Engine已經(jīng)支持計劃任務(wù)和后臺進(jìn)程這兩種編程模型。 限制和資費 首先,談一下App Engine的使用限制,具體請看下表:
表1. App Engine的使用限制 雖然這些限制對開發(fā)者是一種障礙,但對App Engine這樣的多租戶環(huán)境而且卻是非常重要的,因為如果一個租戶的應(yīng)用消耗過多的資源的話,將會影響到在臨近應(yīng)用的正常使用,而App Engine上面這些限制就是為了是運行在其平臺上面應(yīng)用能安全地運行著想,避免了一個吞噬資源或惡性的應(yīng)用影響到臨近應(yīng)用的情況。除了安全的方面考慮之后,還有伸縮的原因,也就是說,當(dāng)一個應(yīng)用的所占空間(footprint)處于比較低的狀態(tài),比如少于1000個文件和大小低于150MB等,那么能夠非常方便地通過復(fù)制應(yīng)用來實現(xiàn)伸縮。 接著,談一下資費情況,App Engine的資費情況主要有兩個特點:其一是免費額度高,現(xiàn)有免費的額度能支撐一個中型網(wǎng)站的運行,且不需付任何費用。其二是資費項目非常細(xì)粒度,普通 IaaS服務(wù)資費,主要就是CPU,內(nèi)存,硬盤和網(wǎng)絡(luò)帶寬這四項,而App Engine則除了常見的CPU和網(wǎng)絡(luò)帶寬這兩項之外,還包括很多應(yīng)用級別的項目,比如:Datastore API和郵件API的調(diào)用次數(shù)等。具體資費的機(jī)制是這樣的:如果用戶的應(yīng)用每天消費的各種資源都低于這個額度,那們用戶無需支付任何費用,但是當(dāng)免費額度被超過的時候,用戶就需要為超過的部分付費。因為App Engine整套資費標(biāo)準(zhǔn)比較復(fù)雜,所以在這里就主要介紹一下它的免費額度,具體請看下表:
表2. App Engine的免費額度表 從上面免費額度來看,除了存儲數(shù)據(jù)的容量外,其它都是非常強大的。 |