Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

在雲端上啜飲爪哇

3,395 views

Published on

The Presentation of JavaTwo 2011 @Taiwan

Published in: Technology, Education
  • Be the first to comment

在雲端上啜飲爪哇

  1. 1. 在雲端上啜飲爪哇
  2. 2. 在雲端上啜飲爪哇 王建興 qing.chwang at gmail.com
  3. 3. 講者簡介 <ul><li>現職 </li></ul><ul><ul><li>聖藍科技技術長 </li></ul></ul><ul><li>譯作 </li></ul><ul><ul><li>Thinking in Java 4th Edition, 正體中文版 </li></ul></ul><ul><ul><li>Thinking in Java 2nd Edition, 正體中文版 </li></ul></ul><ul><ul><li>Essential C++, 正體中文版 </li></ul></ul><ul><li>專欄 </li></ul><ul><ul><li>iTHome 電腦報程式人專欄 </li></ul></ul>
  4. 4. Agenda <ul><li>雲端計算的好處 </li></ul><ul><li>以 Java 發展雲端應用軟體的選項 </li></ul><ul><li>GAE 簡介 </li></ul><ul><li>Case Study </li></ul><ul><li>結論 </li></ul>
  5. 5. 關於這個講題 <ul><li>雲端計算的觀念及具體的實作逐漸普及 </li></ul><ul><li>對 Java 開發者而言, </li></ul><ul><ul><li>基於什麼原因需要開發雲端上的軟體系統 </li></ul></ul><ul><ul><li>若欲開發雲端上的軟體系統,有什麼選項 </li></ul></ul><ul><ul><li>GAE 是一個適合以 Java 開發的雲端平台,該如何於其中開發雲端軟體系統 </li></ul></ul><ul><ul><li>使用 GAE 時,和典型的 Java Web 應用軟體開發上,會有那些差異需要考量 </li></ul></ul>
  6. 6. 雲端計算帶來的好處 <ul><li>對使用者而言 </li></ul><ul><ul><li>只要能上網,服務隨處隨時可得 </li></ul></ul><ul><li>對服務提供者而言 </li></ul><ul><ul><li>快速部署及獲得服務 </li></ul></ul><ul><ul><li>依實際需求量付費 </li></ul></ul><ul><ul><li>減少 IT 建置及管理的複雜度 </li></ul></ul><ul><ul><li>提高服務的規模可擴充性( scalability ) </li></ul></ul>
  7. 7. Java 在雲端的選項 <ul><li>基於既有的 IaaS 平台 </li></ul><ul><ul><li>例: Amazon EC2 </li></ul></ul><ul><li>基於既有的 PaaS 平台 </li></ul><ul><ul><li>例: GAE </li></ul></ul>
  8. 8. Amazon 的雲端計算平台 <ul><li>EC2: Elastic Compute Cloud </li></ul><ul><ul><li>依需要提供計算能力的服務 </li></ul></ul><ul><li>EBS: Elastic Block Service </li></ul><ul><ul><li>依需要提供備份的服務 </li></ul></ul><ul><li>S3: Simple Storage Service </li></ul><ul><ul><li>資料儲存服務 </li></ul></ul><ul><li>SQS: Simple Queue Service </li></ul><ul><ul><li>分散式的訊息佇列服務 </li></ul></ul><ul><li>SimpleDB </li></ul><ul><ul><li>簡易的結構化資料儲存服務 </li></ul></ul>
  9. 9. Amazon EC2 (1/2) <ul><li>虛擬化的計算環境 </li></ul><ul><li>透過 Web Service API 來管理一組 server instances </li></ul><ul><li>依據用量來收費 </li></ul><ul><ul><li>時數 </li></ul></ul><ul><ul><ul><li>Virtual Cores </li></ul></ul></ul><ul><ul><ul><li>Compute Units </li></ul></ul></ul><ul><ul><ul><li>32/64 bits </li></ul></ul></ul><ul><ul><ul><li>Memory </li></ul></ul></ul><ul><ul><ul><li>Storage </li></ul></ul></ul><ul><ul><li>對外頻寬 </li></ul></ul>
  10. 10. Amazon EC2 (2/2) <ul><li>作業系統,主要是 Unix </li></ul><ul><ul><li>Linux </li></ul></ul><ul><ul><li>OpenSolaris </li></ul></ul><ul><li>AMI </li></ul><ul><ul><li>Amazon Machine Image </li></ul></ul><ul><ul><li>內含你所開發的應用程式、程式庫、資料、以及相關的組態設定 </li></ul></ul>
  11. 11. 使用 EC2 對開發者的好處 <ul><li>簡化設定 </li></ul><ul><li>可以立即依需要取得所需數量的伺服器 </li></ul><ul><ul><li>降低初期投資成本 </li></ul></ul><ul><ul><li>當服務推出成功時,可以快速擴增規模 </li></ul></ul><ul><li>減低伺服器管理成本 </li></ul><ul><ul><li>採購 </li></ul></ul><ul><ul><li>日常系統管理 </li></ul></ul>
  12. 12. 在 EC2 上部署 Java Web 應用程式 *Chris Richardson, “Running Java applications on the Amazon Elastic Compute Cloud”
  13. 13. Cloud Tools <ul><li>開放原始碼專案 </li></ul><ul><li>提供快速便利的 EC2 部署 </li></ul><ul><li>提供 32/64 bits 的 AMI </li></ul><ul><li>CentOS 5.10 </li></ul><ul><li>安裝: </li></ul><ul><ul><li>Apache/Tomcat/MySQL/JMeter/JetS3t </li></ul></ul><ul><li>設定 </li></ul><ul><ul><li>Tomcat/MySQL/Apache </li></ul></ul>*http://code.google.com/p/cloudtools/
  14. 14. Java libraries for AWS <ul><li>JetS3t </li></ul><ul><ul><li>存取 S3 的一套 API </li></ul></ul><ul><ul><li>https://jets3t.dev.java.net/ </li></ul></ul><ul><li>Typica </li></ul><ul><ul><li>提供存取 SQS, EC2, SimpleDB 的 API </li></ul></ul><ul><ul><li>http://code.google.com/p/typica/ </li></ul></ul><ul><li>SimpleJPA </li></ul><ul><ul><li>在 SimpleDB 上實作一部份的 JPA 介面 </li></ul></ul><ul><ul><li>http://code.google.com/p/simplejpa/ </li></ul></ul>
  15. 15. 基於 IaaS 平台的優缺點 <ul><li>優點 </li></ul><ul><ul><li>運用彈性高 </li></ul></ul><ul><ul><li>可量身訂製打造自需的環境及架構 </li></ul></ul><ul><li>缺點 </li></ul><ul><ul><li>需處理較多和系統架構相關的議題 </li></ul></ul><ul><ul><ul><li>規模擴充性 </li></ul></ul></ul><ul><ul><ul><li>容錯 </li></ul></ul></ul><ul><ul><li>需自行管理及設定 </li></ul></ul>
  16. 16. 基於 PaaS 平台開發應用軟體 <ul><li>PaaS 平台提供者,處理大架構上的技術議題 </li></ul><ul><ul><li>規模可擴充性 </li></ul></ul><ul><ul><li>系統容錯能力 </li></ul></ul><ul><ul><li>系統穩定度 </li></ul></ul><ul><ul><li>系統安全性 </li></ul></ul><ul><li>應用系統開發者 </li></ul><ul><ul><li>專注於應用本身 </li></ul></ul>
  17. 17. 規模擴展時的議題 <ul><li>當你需要擴展系統規模時 </li></ul><ul><ul><li>加機器? </li></ul></ul><ul><ul><li>加記憶體? </li></ul></ul><ul><ul><li>加資料庫伺服器? </li></ul></ul><ul><ul><li>調整系統架構? </li></ul></ul><ul><ul><ul><li>增加快取伺服器 </li></ul></ul></ul><ul><ul><ul><li>使用 NoSQL </li></ul></ul></ul><ul><ul><ul><li>… </li></ul></ul></ul>
  18. 18. 這正是為什麼有時候我們需要基於 PaaS 平台來開發的重要原因之一
  19. 19. 什麼是 GAE ? (1/2) <ul><li>Google: Google App Engine 讓你得以在和 Google 自身應用程式所處的相同系統上,開發並且運行 Web 應用程式 </li></ul><ul><li>Wikipedia: Google App Engine 是個在 Google 所管理的資料中心之上開發及運行 Web 應用程式的平台 </li></ul>
  20. 20. 什麼是 GAE ? (2/2) <ul><li>GAE 讓你在 Google 所打造的基礎設施之上運行 Web 應用程式 </li></ul><ul><li>在 GAE 上開發應用程式 </li></ul><ul><ul><li>開發容易 </li></ul></ul><ul><ul><li>維護容易 </li></ul></ul><ul><ul><li>擴充規模也很容易 </li></ul></ul>
  21. 21. 執行環境及程式語言 <ul><li>採用標準 Java 執行環境 </li></ul><ul><ul><li>標準化的 Java 技術 </li></ul></ul><ul><ul><ul><li>JVM </li></ul></ul></ul><ul><ul><ul><li>Java servlets </li></ul></ul></ul><ul><ul><ul><li>Java 程式語言 </li></ul></ul></ul><ul><ul><li>可運行於 JVM 的其他直譯式 / 編譯式語言 </li></ul></ul><ul><ul><ul><li>JavaScript </li></ul></ul></ul><ul><ul><ul><li>Ruby </li></ul></ul></ul><ul><ul><ul><li>Go </li></ul></ul></ul><ul><li>也提供 Python 執行環境 </li></ul>
  22. 22. 成本及預算 <ul><li>用多少付多少 </li></ul><ul><li>沒有設置成本,也沒有循環費用 </li></ul><ul><li>一開始使用可毋需付費 </li></ul><ul><li>提供免費額度的資源,足以支持有每月五百萬次頁面檢視量 </li></ul><ul><ul><li>500 MB 儲存空間 </li></ul></ul><ul><ul><li>足夠的 CPU 計算力 </li></ul></ul><ul><ul><li>足夠的頻寬 </li></ul></ul><ul><li>依據應用程式所動用的資源計費 </li></ul><ul><ul><li>儲存空間 </li></ul></ul><ul><ul><li>頻寬 </li></ul></ul><ul><li>可以控制應用程式資源使用的上限 </li></ul>
  23. 23. 行情 *http://code.google.com/intl/en/appengine/docs/billing.html $0.64 Hourly per instance Backends ( B8   class) $0.32 Hourly per instance Backends ( B4   class) $0.16 Hourly per instance Backends ( B2   class) $0.08 Hourly per instance Backends ( B1   class) $0.30 N/A (daily) Always On $0.0001 recipients Recipients Emailed $0.45 gigabytes per month High Replication Storage $0.15 gigabytes per month Stored Data $0.10 CPU hours CPU Time $0.10 gigabytes Incoming Bandwidth $0.12 gigabytes Outgoing Bandwidth Unit cost Unit Resource
  24. 24. 架構 Request Response Web page transactions Result Browser  URL fetch or E-mail More services Schedule routine Static Storage HTTP / HTTPS * 清大資工鍾葉青教授雲端計算課程講義投影片 Web interface Sandbox Runtime environment Datastore Memcache
  25. 25. GAE 採用 Sandbox 的概念 <ul><li>利用 Sandbox 來做隔離及保護 </li></ul><ul><li>應用程式運行於一方面安全,一方面又受限的環境中 </li></ul><ul><li>所施加的限制,都是為了提供 </li></ul><ul><ul><li>易於擴充規模 </li></ul></ul><ul><ul><li>隔離安全不受干擾侵犯 </li></ul></ul><ul><li>的執行環境 </li></ul>
  26. 26. GAE 上的諸般限制 例一:網路存取 <ul><li>應用程式僅能對外進行兩種網路存取 </li></ul><ul><ul><li>以 URL 形式存取 </li></ul></ul><ul><ul><li>發送電子郵件 </li></ul></ul><ul><li>若欲連結至應用程式,僅能以兩種協定建立連線 </li></ul><ul><ul><li>HTTP ( 80 port ) </li></ul></ul><ul><ul><li>HTTPS( 443 port ) </li></ul></ul><ul><li>無法建立任意 TCP/UDP 連線,連至其他伺服器 </li></ul><ul><li>無法自行建立任何 socket port 供其他應用程式連接 </li></ul><ul><li>這些 限制是基於安全性考量 </li></ul>
  27. 27. GAE 上的諸般限制 例二:檔案系統存取 <ul><li>應用程式無法對檔案系統進行存取 </li></ul><ul><li>應用程式僅能讀取與應用程式一起打包上傳的檔案 </li></ul><ul><li>在 GAE 上,任何資料僅能儲存在 </li></ul><ul><ul><li>Datastore </li></ul></ul><ul><ul><li>memcache </li></ul></ul><ul><li>這些限制是基於規模擴充性及系統安全性 </li></ul>
  28. 28. GAE 上的諸般限制 例三:執行時間及方式 <ul><li>程式碼的執行只能用在三種場合 </li></ul><ul><ul><li>處理來自於 Web 端的請求 </li></ul></ul><ul><ul><li>排程執行的 task </li></ul></ul><ul><ul><li>Backend </li></ul></ul><ul><li>應用程式在處理來自 Web 端的請求時,得在 30 秒內完成回應 </li></ul><ul><li>應用程式不能衍生額外的執行緒 </li></ul><ul><li>這些限制是基於安全性及規模擴充性 </li></ul>
  29. 29. GAE 上的 Java 執行環境 (1/2) <ul><li>Java Runtime Environment </li></ul><ul><ul><li>Java Servlet </li></ul></ul><ul><ul><li>JavaServer Pages (JSPs). </li></ul></ul><ul><li>Java Version </li></ul><ul><ul><li>Java 6 </li></ul></ul><ul><ul><li>使用 Java 5 或 Java 6 皆可 </li></ul></ul><ul><ul><li>Sandbox 上的諸般限制,皆於 JVM 中實作 </li></ul></ul>
  30. 30. GAE 上的 Java 執行環境 (2/2) <ul><li>API </li></ul><ul><ul><li>Java 標準 APIs </li></ul></ul><ul><ul><li>Java Data Objects (JDO)/ Java Persistence API (JPA) </li></ul></ul><ul><ul><li>JavaMail API </li></ul></ul><ul><ul><li>java.net HTTP API </li></ul></ul><ul><ul><li>Google Accounts APIs </li></ul></ul><ul><li>程式語言 </li></ul><ul><ul><li>Java </li></ul></ul><ul><ul><li>JavaScript </li></ul></ul><ul><ul><li>Ruby </li></ul></ul><ul><ul><li>Scala </li></ul></ul><ul><ul><li>Go </li></ul></ul>
  31. 31. GAE 的 Datastore (1/2) <ul><li>GAE 的 Datastore 是一個分散式的資料儲存服務 </li></ul><ul><ul><li>具規模擴充性 </li></ul></ul><ul><ul><li>有 transaction 的能力 </li></ul></ul><ul><li>GAE 的 Datastore 和傳統的關聯式資料庫不同 </li></ul><ul><ul><li>其中的 data object (稱為 entity ),都擁有一組屬性 </li></ul></ul><ul><ul><li>Datastore 的 entity 沒有所謂 schema 的觀念 </li></ul></ul>
  32. 32. GAE 的 Datastore (2/2) <ul><li>可透過 JDO/JPA 的 API 來存取 Datastore </li></ul><ul><li>Datastore 能維持資料的一致性( strong consistent ) </li></ul><ul><li>Datastore 採用樂觀式並行性控制( optimistic concurrency control ) </li></ul>
  33. 33. 處理 Datastore 會是在 GAE 上開發應用系統的最大挑戰
  34. 34. Kind 、 Entity 、 Key 、 Property User 傳統關聯式資料庫 Datastore *Cloud Tu @TWJUG User Sport Null Null Favor2 Movie Null Null Favor3 Music Cloud 1 Music Tom 3 Null John 2 Favor1 Name PK Music Favor Cloud Name 1 Key John Name 2 Key Music , Sport , Movie Favor Tom Name 3 Key Kind Table Key PK Property Field Entity Row
  35. 35. Native Datastore 操作 DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); Entity employee = new Entity(&quot;Employee&quot;); employee.setProperty(&quot;firstName&quot;, &quot;Antonio&quot;); employee.setProperty(&quot;lastName&quot;, &quot;Salieri&quot;); Date hireDate = new Date(); employee.setProperty(&quot;hireDate&quot;, hireDate); employee.setProperty(&quot;attendedHrTraining&quot;, true); datastore.put(employee); Kind Entity Key Property *Cloud Tu @TWJUG 在 Entity 的 constructor 中指定。未指定時,系統會自動指派一個 UUID 的 key
  36. 36. 用 JDO 的方式描述資料 (1/2) <ul><li>@PersistenceCapable(identityType = IdentityType.APPLICATION) </li></ul><ul><li>public class Album </li></ul><ul><li>{ </li></ul><ul><li>@PrimaryKey </li></ul><ul><li>@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) </li></ul><ul><li>private Long id; </li></ul><ul><li>@Persistent </li></ul><ul><li>private String albumURL; </li></ul><ul><li>@Persistent </li></ul><ul><li>private String owner; </li></ul><ul><ul><li>… </li></ul></ul>
  37. 37. 用 JDO 的方式描述資料 (2/2) <ul><li>public Album(String _albumURL, String _owner, String _siteProvider) </li></ul><ul><li>{ </li></ul><ul><li>albumURL = _albumURL; </li></ul><ul><li>owner = _owner; </li></ul><ul><li>siteProvider = _siteProvider; </li></ul><ul><li>status = 0; </li></ul><ul><li>submitDate = new Date(); </li></ul><ul><li>} </li></ul><ul><li>public Long getId() </li></ul><ul><li>{ </li></ul><ul><li>return id; </li></ul><ul><li>} </li></ul><ul><li>public String getAlbumURL() </li></ul><ul><li>{ </li></ul><ul><li>return albumURL; </li></ul><ul><li>} </li></ul><ul><ul><li>… </li></ul></ul>
  38. 38. 對 Datastore 進行查詢 <ul><li>Query q = new Query(&quot;Person&quot;); q.addFilter(&quot;lastName&quot;, </li></ul><ul><li>Query.FilterOperator.EQUAL , </li></ul><ul><li>lastNameParam); q.addFilter(&quot;height&quot;, </li></ul><ul><li>Query.FilterOperator.LESS_THAN , </li></ul><ul><li>maxHeightParam); PreparedQuery pq = datastore.prepare(q); pq.asIterable(); </li></ul>
  39. 39. JDO/Query Language public byte[] getPhoto(long id) { PersistenceManager pm = PMF.get().getPersistenceManager(); String query = &quot;select from &quot; + Photo.class.getName() + &quot; where id == &quot;+id; List<Photo> photos = (List<Photo>) pm.newQuery(query).execute(); if( photos.isEmpty() ) { pm.close(); return null; } Photo p = photos.get(0); Blob content = p.getContent(); byte[] b = content.getBytes(); pm.close(); return b; }
  40. 40. EntityGroup <ul><li>擁有相同 ParentKey 的 Entity 即屬於同一 EntityGroup </li></ul><ul><li>對位在同一 EntityGroup 內 Entity 所進行的操作可在同一 transaction 裡 </li></ul><ul><li>適合 One to Many 的資料表示方式 </li></ul>
  41. 41. EntityGroup User *Cloud Tu @TWJUG 自動產生 RootKey ParentKey Cloud Name 1 Key 自動產生 RootKey ParentKey John Name 2 Key 2 ParentKey Mary Name 3 Key 2 ParentKey Mary Name 4 Key 2 ParentKey Joe Name 5 Key A EntityGroup B EntityGroup
  42. 42. 建構 EntityGroup Entity parent = new Entity(&quot;User&quot;); Entity child1 = new Entity(&quot;User&quot;, parent.getKey()); Entity child2 = new Entity(&quot;User&quot;, parent.getKey()); Constructor 未指定其 ParentKey 時,系統會自動產生一個 RootKey <ul><li>child1 、 child2 有相同的 parentkey ,二者可在同一 transaction 進行資料操作 </li></ul><ul><li>可在 parent 刪除時,一併把 children(child1 、 child2) 刪除 ( 註:非系統本身特性,而是在刪除時在程式碼裡註明一併刪除 ) </li></ul><ul><li>一個 transaction 中僅能有一 EntityGroup 進行操作 </li></ul>*Cloud Tu @TWJUG
  43. 43. Google Accounts (1/2) <ul><li>GAE 應用程式能直接運用 Google Account 做為使用者認證的機制 </li></ul><ul><ul><li>對使用者來說,要使用應用程式毋需註冊新帳號 </li></ul></ul><ul><ul><li>對開發者來說,不需要另行實作認證機制 </li></ul></ul><ul><li>GAE 應用程式運用 Google Account 時,能取得一些使用者的資訊,包括 </li></ul><ul><ul><li>Email 位址 </li></ul></ul><ul><ul><li>顯示名稱 </li></ul></ul>
  44. 44. Google Accounts (2/2) <ul><li>系統管理者身份 </li></ul><ul><ul><li>透過 Users API 可以知道目前所服務的使用者,是否為註冊的系統管理員 </li></ul></ul>
  45. 45. GAE 提供的 Service (1/2) <ul><li>URL Fetch </li></ul><ul><ul><li>使用同於 Google infrastructure 的高速網路來存取網路上的資源 </li></ul></ul><ul><li>Mail </li></ul><ul><ul><li>使用 Google infrastructure 來寄送電子郵件 </li></ul></ul>
  46. 46. GAE 提供的 Service (2/2) <ul><li>Memcache </li></ul><ul><ul><li>讓應用程式以 key-value 方式,高效存取 in-memory 的快取資料 </li></ul></ul><ul><li>Image Manipulation </li></ul><ul><ul><li>提供操作影像的各種基本操作,包括尺寸變更、裁剪、旋轉、以及翻轉等 </li></ul></ul><ul><ul><li>支援 JPEG 及 PNG 格式 </li></ul></ul>
  47. 47. Scheduled Tasks <ul><li>依照所設定的排程(例如,每小時 、 每天),來執行對應的工作 </li></ul><ul><li>也就是傳統所說的“ cron jobs” </li></ul>
  48. 48. Backends (1/2) <ul><li>Backends 是在 GAE 中一種特殊的 instance </li></ul><ul><ul><li>沒有執行時間限制 </li></ul></ul><ul><ul><li>有更多的記憶體空間 </li></ul></ul><ul><ul><li>有更高的 CPU 限制 </li></ul></ul><ul><li>適合長期執行的工作任務 </li></ul><ul><li>有兩種類型 </li></ul><ul><ul><li>常駐( resident ) </li></ul></ul><ul><ul><li>動態( dynamic ) </li></ul></ul>
  49. 49. Backends (2/2) <ul><li>無法依 request 量自動 scale </li></ul><ul><ul><li>僅能指定 instance 的量 </li></ul></ul><ul><li>每個 Backend instance 可對應到 unique 的 URL </li></ul><ul><ul><li>http://[instance].[backend].[app].appspot.com </li></ul></ul><ul><ul><li>未指定 instance 則指定至第一個 instance </li></ul></ul>
  50. 50. GAE 中三種類型的程式碼 Request Handler Scheduled Task Backend
  51. 51. 同與異 (1/2) <ul><li>基於 GAE 開發 Web 應用系統和傳統非雲端平台的開發幾乎是相同的 </li></ul><ul><li>同樣的程式語言 </li></ul><ul><li>同樣的標準 API </li></ul><ul><li>同樣的 Web 技術及框架 </li></ul>
  52. 52. 同與異 (2/2) <ul><li>因應雲端平台所需的特性,也有一些差異 </li></ul><ul><li>掌握這些差異,就能順利的遷移至雲端開發 </li></ul><ul><ul><li>Sandbox 中的限制 </li></ul></ul><ul><ul><li>Web 端執行時間的限制 </li></ul></ul><ul><ul><li>操作資料的方式大異於傳統關聯式資料庫的存取 </li></ul></ul>
  53. 53. GAE SDK <ul><li>下載 </li></ul><ul><ul><li>http://code.google.com/intl/zh-TW/appengine/downloads.html </li></ul></ul><ul><li>內含一個 Web server </li></ul><ul><ul><li>在本地端模擬 GAE 的所有 service </li></ul></ul><ul><ul><li>在本地端模擬 sandbox 的行為 </li></ul></ul><ul><ul><li>小細節處略有差異 </li></ul></ul><ul><li>提供在 GAE 上可取用的所有 API 及 library </li></ul>
  54. 54. GAE 開發流程 (1/3) <ul><li>編譯方式 </li></ul><ul><ul><li>Google Plugin for Eclipse </li></ul></ul><ul><ul><li>Ant build tool </li></ul></ul><ul><li>開發 </li></ul><ul><ul><li>使用 GAE SDK 中的 API 及 library 搭配標準的 Java 開發環境 </li></ul></ul><ul><ul><li>部署至本地端的 Web server 進行測試 </li></ul></ul>
  55. 55. GAE 開發流程 (2/3) <ul><li>發行 </li></ul><ul><ul><li>使用 SDK 所附的工具上傳應用程式 </li></ul></ul><ul><ul><li>使用工具上傳時需指定開發者的 Google 帳戶及密碼 </li></ul></ul><ul><li>改版 </li></ul><ul><ul><li>可利用上傳工具上傳新版本 </li></ul></ul><ul><ul><li>進行測試 </li></ul></ul><ul><ul><li>切換至新版運行 </li></ul></ul>
  56. 56. GAE 開發流程 (3/3) <ul><li>系統管理 </li></ul><ul><ul><li>Web 介面進行系統管理的諸般操作 </li></ul></ul><ul><ul><li>提供 Web 介面進行系統管理的諸般操作 </li></ul></ul><ul><ul><ul><li>創建新的應用程式 </li></ul></ul></ul><ul><ul><ul><li>設定應用程式的域名 </li></ul></ul></ul><ul><ul><ul><li>將應用程式的運行版本切換至新版本 </li></ul></ul></ul><ul><ul><ul><li>檢視存取及錯誤的日誌記錄 </li></ul></ul></ul><ul><ul><ul><li>瀏覽應用程式的 datastore </li></ul></ul></ul>
  57. 57. 域名 <ul><li>你可以選擇自有的域名 </li></ul><ul><li>你也可以選擇使用 GAE 服務提供的免費域名 *.appspot.com </li></ul><ul><ul><li>例如: diggirlcloud.appspot.com </li></ul></ul>
  58. 58. 克服各種限制 <ul><li>不能自建 Thread </li></ul><ul><li>回應必須即時( 30 秒) </li></ul><ul><li>沒有檔案系統可運用 </li></ul><ul><li>僅有 HTTP/HTTPS 及 Email 服務可對外存取資源 </li></ul><ul><li>Session 中的物件必須 serializable </li></ul>
  59. 59. 到雲端上喝 Java 咖啡 <ul><li>重新打造全新的應用程式 </li></ul><ul><ul><li>掌握 GAE 上的特性及限制 </li></ul></ul><ul><li>移植舊有的系統至 GAE </li></ul><ul><ul><li>資料模式的轉變 </li></ul></ul><ul><ul><li>非 request/response 處理的程式,需改以排程 Task 或 Backend 來處理 </li></ul></ul><ul><ul><li>面對 30 秒限制 </li></ul></ul>
  60. 60. Case Study <ul><li>Diggirl x Cloud </li></ul><ul><ul><li>移植舊有的網站至 GAE 上 </li></ul></ul><ul><li>Directory Service </li></ul><ul><ul><li>擴展既有的 Directory Service ,改以 GAE 做為輔助 </li></ul></ul>
  61. 61. Diggirl x Cloud
  62. 62. Diggirl x Cloud for iPhone (1/2)
  63. 63. Diggirl x Cloud for iPhone (2/2)
  64. 64. Diggirl 考慮移植至 GAE 的原因 <ul><li>節省基礎建設投資及開支 </li></ul><ul><ul><li>主機 </li></ul></ul><ul><ul><li>頻寬 </li></ul></ul><ul><li>簡化系統管理及維護 </li></ul><ul><li>得到極佳的系統可擴充性及穩定性 </li></ul><ul><li>移植方便 </li></ul><ul><ul><li>標準化的 Java Servlet/JSP 技術 </li></ul></ul><ul><li>立足 Google Infrastructure </li></ul>
  65. 65. 移植過程的變化 <ul><li>資料儲存 </li></ul><ul><ul><li>MySQL -> GAE Datastore </li></ul></ul><ul><ul><li>SQL -> NoSQL (具規模可擴充性) </li></ul></ul><ul><ul><li>使用 JDO 來存取( Object-Oriented ) </li></ul></ul><ul><li>相簿擷取 </li></ul><ul><ul><li>利用 URL Fetch Service 擷取(快) </li></ul></ul><ul><ul><li>利用 Image Service 製作縮圖(快) </li></ul></ul><ul><li>定期的排名計算 </li></ul><ul><ul><li>Cron Job -> Schedule Tasks </li></ul></ul>
  66. 66. 移植過程的困難 <ul><li>資料模型的轉變 </li></ul><ul><ul><li>因為原來的資料模型就很單純,所以轉換沒有太大問題 </li></ul></ul><ul><ul><li>原來的資料存取層採用 Business Façade 模式,所以衝擊都被它隔離了 </li></ul></ul><ul><li>沒有檔案系統 </li></ul><ul><ul><li>改用 Datastore 中的 Blob 來儲存資料 </li></ul></ul><ul><ul><li>用 Datastore 儲存圖片資料是相對昂貴的 </li></ul></ul><ul><ul><li>可改用 Amazon S3 服務來做圖片的儲放及存取 </li></ul></ul>
  67. 67. Directory Service 的原有架構 Internet API
  68. 68. Directory Service 的現有問題 <ul><li>需要全年不間斷的提供服務 </li></ul><ul><ul><li>IT 的維護人力 </li></ul></ul><ul><li>有時還會遭遇 DDoS 攻擊 </li></ul><ul><li>全球建置伺服器的成本 </li></ul><ul><li>資料規模擴充性 </li></ul>
  69. 69. 採 GAE 輔助的新架構 Internet Internet API API
  70. 70. 移植過程的變化 <ul><li>資料模型的轉變 </li></ul><ul><ul><li>MySQL -> GAE Datastore </li></ul></ul><ul><ul><li>SQL -> NoSQL (具規模可擴充性) </li></ul></ul><ul><ul><li>使用 native 的 Datastore API </li></ul></ul><ul><ul><li>Normalized -> Denormalized (提升效率) </li></ul></ul><ul><li>定期的排名計算 </li></ul><ul><ul><li>Cron Job -> Schedule Tasks </li></ul></ul>
  71. 71. Schemaless 的設計變動 <ul><li>Denormaliztion </li></ul><ul><ul><li>減少 table 的數量 </li></ul></ul><ul><ul><li>增加效率 </li></ul></ul><ul><li>目錄中的項目有很多不同的分類,而目錄會依據分類提供項目的排名 </li></ul><ul><ul><li>舊有的方式是個別再建排名表 </li></ul></ul><ul><ul><li>新的方式是每個項目多若干個 property ,用來表示它在某分類的排名 </li></ul></ul><ul><ul><ul><li>例如 Rank_XXX 的值代表它在 XXX 分類下的排名 </li></ul></ul></ul><ul><ul><li>只要用 sort query 針對 Rank_XXX 進行查詢,即可查出 XXX 分類下依據排名的項目清單 </li></ul></ul>
  72. 72. 得道昇天後的好處 <ul><li>穩固 </li></ul><ul><li>快,就是快 </li></ul><ul><li>解決規模擴充性問題 </li></ul><ul><li>節省基礎施設投資 </li></ul>
  73. 73. 結論 <ul><li>Java/JVM 在 PaaS 領域中絕對是扮演舉足輕重的角色 </li></ul><ul><li>基於 Java 的 PaaS 開發應用系統,可以協助解決眾多的議題 </li></ul><ul><li>從小規模到大規模都適合在雲端上開發 </li></ul>
  74. 74. Special Thanks To <ul><li>Itszero </li></ul><ul><ul><li>http://twitter.com/itszero </li></ul></ul><ul><ul><li>http://itszero.org/ </li></ul></ul><ul><li>Cloud Tu </li></ul><ul><ul><li>http://cloudtu.blogspot.com/ </li></ul></ul><ul><li>Gen Tseng </li></ul>
  75. 75. Resources <ul><li>GAE 簡介 </li></ul><ul><ul><li>http://code.google.com/intl/en/appengine/docs/java/overview.html </li></ul></ul>
  76. 76. Thanks!

×