Google App Engine

Google App Engine是一個開發、託管網路應用程式的平台，使用Google管理的數據中心。它在2008年4月發布了第一個beta版本。

Google App Engine使用了雲計算技術。它跨越多個伺服器和數據中心來虛擬化應用程式。

Google App Engine在使用者使用一定的資源時是免費的。支付額外的費用可以獲得應用程式所需的更多的存儲空間、帶寬或是CPU負載。

## 支持的程式語言和框架

當前，Google App Engine支持的程式語言是Python、Java、PHP和Go（通過擴展，可以支持其他JVM語言，諸如Groovy、JRuby、Scala和Clojure）。支持Django、WebOb、PyYAML的有限版本。Google說它準備在未來支持更多的語言，Google App Engine也將會獨立於某種語言。任何支持WSGI的使用CGI的Python框架可以使用。框架可以與開發出的應用程式一同上傳，也可以上傳使用Python編寫的第三方庫。

## 與其他應用程式託管的區別

與其他可擴展的託管服務（例如Amazon EC2）比較，App Engine提供了更多基礎服務來方便編寫可擴展的應用程式，但僅限於App Engine設計框架以內的應用程式。

App Engine的基礎服務省卻了許多系統管理的操作，以便將規模擴大到數以百萬計的訪問。Google負責處理一組代碼，可以監測、容錯，在必要的時候還會開發一些應用實例。

有些應用程式託管服務讓使用者安裝、配置幾乎所有*NIX兼容的軟體，而App Engine則要求開發者使用Python或Java語言來編程，而且只能使用一套限定的API。當前的API允許程序於一個BigTable非關係資料庫上存儲和檢索數據、提出HTTP請求、發送E-mail、處理圖像、還有緩存。大多數現存的Web應用程式，若未經修改，均不能直接在App Engine上運行，因為它們需要使用關係資料庫。

帶寬和CPU的使用、送達請求的數量、並發請求的數量、以及調用各種API的次數，皆設有每天和每分鐘的限額。個別的請求，如果需時超過30秒或返回超過10MB的數據，都會被終止。

## SQL與GQL的區別

Google App Engine的Datastore使用一個與SQL類似的語言，叫做「GQL」。在GQL中，SELECT語句僅可以用於一個表。因為要跨越不只一台機器， GQL不支持效率很低的JOIN語句。欲建立一對多和多對多的關係，可使用ReferenceProperty。採用這種無共享的方式，即使磁碟壞了，系統也不致癱瘓。

在GQL中，SELECT語句中的WHERE從句只容許對僅僅一列進行>、>=、<或<=比較。所以，僅僅可以構造簡單的WHERE從句。在數據建模時，要從關係資料庫轉換到Datastore，開發者需要轉變觀念。

App Engine限制每次Datastore請求最多返回1000行數據。大多數Web應用程式，都不會受此影響，因為它們通常並不會在一張頁面上列出超過1000條記錄（可以用分頁和緩存機制），只要按順序返回結果就可以了。若有應用程式需要在一次操作中返回更多的記錄，則需自行使用客戶端軟體或者Ajax頁面，按查詢順序提取更多條記錄。

這個Datastore的API是不關聯的，有別於一般關係資料庫——比如IBM DB2、Microsoft SQL Server、MySQL、Oracle資料庫、或者PostgreSQL。

## 限制

- 在App Engine的檔案系統中，開發者只有讀取的權限。
- App Engine僅可在回應HTTP請求時執行代碼（計劃的後台任務、任務隊列和XMPP服務則不在此限）。
- 使用者可以上傳任意的Python模塊，但必須是純Python模塊，不得包含C擴展程序或其他需要編譯的代碼。
- App Engine限制每次Datastore請求最多返回1000行數據。
- Java應用程式只能使用JRE基本版本類庫中的一個子集（JRE類白名單）。
- Java應用程式不能創建新的線程。

## 可移植性

開發者擔心App Engine應用程式不能移植到其他平台上，因而被困在單一種技術(Vendor lock-in)之內。

## 從App Engine下載數據

App Engine自SDK1.2.2版開始，已容許以批量的方式下載數據。此外，使用者也可使用開源項目gaebar、approcket 和gawsh 來下載、備份在App Engine上的數據。

## 限額

免費帳戶使用App Engine時，受配額限制。應用程式作者可以視乎需要，付錢購買更多配額。

### 硬性限制

項目｜限制

每次請求的時間｜普通請求60秒，任務請求10分鐘，後台請求無限

每個應用程式的文件｜1000個

HTTP響應的大小｜32 MB

Datastore單項大小｜1 MB

應用程式代碼大小｜150 MB

### 免費的配額

供免費使用的配額曾於2009年5月25日、2009年6月22日以及2011年5月三度下調。

項目｜配額

每天的Email數量｜100封

每天的輸入數據｜無限

每天的輸出數據｜1 GB

每天可使用CPU｜28小時

每天調用Datastore API次數｜50000次*

數據存儲｜1 GB

每天調用URLFetch API次數｜657000次*

## 競爭對手

Google App Engine與Amazon Web Services（一個應用程式服務系統，支持在Amazon的伺服器上託管文件、執行代碼）直接競爭。不少科技分析師早在多年前已預計過，Google會加入這場競賽。其中，Techdirt的出版人Mike Masnick寫到，「Google終於了解到它需要覇佔網路平台這個地位。我們可以期待，開發及落實易於擴展的網路應用程式會變得越來越容易，而應用程式也會越來越具創意。」

此外，紅帽公司的 openshift、微軟的Azure服務平台以及 Koding 也是Google App Engine的競爭對手。

## 中華人民共和國封鎖

由於Google App Engine允許用戶託管網路應用程式，且伺服器不在中華人民共和國境內，故有部分使用者利用其搭建代理（如GoAgent）用於突破防火長城的審查，故Google App Engine的域名 *.appspot.com 的SSL加密連接長期遭到防火長城的封鎖。

- 2010年12月20日，Google App Engine的域名 appspot.com 遭到防火長城的關鍵詞過濾封鎖。由於先前Google App Engine的SSL連接已經被封，故中華人民共和國境內的使用者無法正常連接與使用。此次Google App Engine被封鎖適逢2010年諾貝爾和平獎頒獎典禮。appspot.com非加密連接於2010年12月23日解封。
- 2011年3月兩會召開前夕，appspot.com 再次遭到防火長城的關鍵詞過濾封鎖及域名污染，同時部分伺服器的IP位址亦遭到徹底屏蔽，甚至兩會結束後至今亦沒有解封。
- 至今appspot.com仍遭到DNS投毒污染、URL域名關鍵詞過濾和伺服器IP位址屏蔽三重封鎖，無法從中華人民共和國正常訪問，但也仍有一些軟體或使用者通過修改本機Hosts等方法繞過封鎖以使用GAE。

## 外部連結

- Official marketing page
- https://cloud.google.com/appengine/docs
- Official Google Cloud Platform Blog
- Release notes
- Google App Engine - Run your web applications on Google's infrastructure - a technical talk by Google engineer Guido van Rossum at Stanford University. ( online video archive)
- Benefits of adopting Google App Engine
- Using an external database with Google App Engine
- Java Frameworks and libraries supported
- Web2py book -- online documentation -- Google App Engine deployment recipe
- Google Cloud SQL Sample Projects
- Google Cloud supports node.js
- Appmd: Python development sample project. App Engine/django/Google Closure/Endpoints/Material design
- https://tw.cocloud.com/zh-tw/blog/google-compute-engine
- https://tw.cocloud.com/zh-tw/blog/google-kubernetes-Engine
- https://tw.cocloud.com/zh-tw/blog/gcp-teaching-encyclopedia

## 基本資料

- 開發者：Google
- 發行日期：2008年4月7日
- 軟體版本週期：1.9.51
- 程式語言：Python、Java、Go、PHP, Node.js
- 作業系統：linux (glibc)、Windows
- 平台：little-endian 32bits
- 類型：Web應用框架、雲端運算
- 許可協議：專有軟體、LGPL