技術人員開發云計算從這里下手
云計算2009年仍然延續了它在2008年的熱度,不難預料,運行在云上的應用(以下簡稱云應用)肯定會越來越多,隨之而來的是,肯定會有越來越多的開發人員不得不考慮或者參與開發云計算。
云計算的本質是通過互聯網訪問應用和服務,這些應用或者服務通常不是運行在自己的服務器上而是由第三方提供。對開發云計算的技術人員而言,在云計算模式下,盡管部署應用時無需關心基礎設施方面的問題,但同時也帶來了一些新的問題,比如開發云計算人員不能用以前熟悉的方式調用數據庫、應用程序呈無狀態特性以及必須采用不同的開發框架等。
開發云計算的挑戰
“開發云計算最大的挑戰是,軟件必須能根據應用的需求自己調整和提供所需要的資源。”Sun云計算部門CTO Lew Tucker說,幸運的是,借助云平臺提供的API,云應用的開發人員可以從云的提供方申請更多的資源。
開發云計算人員還必須進行冗余設計,要認識到很有可能在“云”中的服務器只是普通的服務器,微軟Azure云平臺副總裁Amitabh Srivistava說,“很有可能服務器會出問題,因此,你必須在開發云應用時考慮冗余。”
開發云計算時還必須考慮到Web應用的無狀態特性(無狀態性是指客戶端和服務器端不必保存對方的詳細信息,服務器只需要處理當前請求,而不必了解所有的請求歷史—編者注),Srivistava說,“如果你的程序要求保留狀態信息,程序在運行過程中肯定會出問題。云計算的模式是,如果什么地方出了問題就終止它,然后另外再啟動一個程序。只有保證每個應用程序的運行都是相對獨立的,也就是狀態無關,才能達到這一目標。”
Srivistava進一步解釋說,例如,在云中沒有本地磁盤這個概念,也沒有注冊,在無狀態的應用中,這些參數都要被封裝起來打包在調用的參數中。
Sun公司Tucker提醒說:“無狀態保證了應用程序簡單,但是,要開發出真正有趣而且好用的云計算應用又需要一些狀態信息,比如我們必須保存用戶的信息以免要求用戶不停地登錄,這就是為什么我們仍然需要數據庫或者其他一些什么東西來保存狀態的原因。”但是,有部分云上的應用(如Web的前端)需要根據訪問量動態地進行調節,必須是無狀態的。
開發云計算應用的另外一個特點是:應用程序的不同部分可能分別運行在云的不同地方。例如,一個應用程序的表現層可能運行在Facebook,而其存儲部分可能運行在亞馬遜的彈性存儲服務(S3)上,其應用程序的邏輯部分又可能運行在另外一個完全不同的地方。
“而以前程序員開發的程序都運行在自己的服務器上。” Tucker說,“這就意味著,開發云計算應用時必須重新考慮系統的架構,特別是要考慮云應用的大規模特性,不僅是用戶數量大,而且計算資源分布也很分散。”
Tucker補充說:“也不要把云應用想得多么神秘。其實沒有什么訣竅,要讓開發云計算應用可擴展,需要仔細地設計和規劃。”
不過,云平臺可以給我們提供一些幫助。在某些情況下,比如使用Google App Engine來開發某些特定的應用時,程序自然就具有了可擴展性,無需開發人員考慮。有時候,我們可以使用某些設計模式,這些設計模式可以用來為應用程序提供擴展能力。例如,亞馬遜彈性計算云(EC2)的Multiple Availability Zones,開發云計算人員在這里可以把一個應用部署到多個地方運行。
“以前,只有大公司能做到這一點。” Kay Kinton公司的發言人說。EC2有一種稱為彈性IP的功能,它能快速建立一個互聯網地址的映射,把準備發送給失敗的應用實例的請求轉給一個有效的實例。
不同類型的數據庫
在云應用中,抽象和無狀態在對數據庫的訪問時也同樣適用。“例如,Azure就給 開發云計算人員提供了一種與訪問標準的關系型數據庫完全不同的方式。”Benjamin Day咨詢公司總裁Ben Day說,“Azure的存儲引擎也沒有使用關系數據庫,因此以前開發應用時所采用的很多方法在開發云應用時就行不通了。”
他還以關系型數據庫中的存儲過程為例來說明,在關系型數據庫中,查詢邏輯與實際的數據位置很近,編程者可以明確知道數據在哪里、保存在哪些設備上,而在Azure云中,這個前提不再存在。
“開發云計算應用在訪問數據庫時的困難在于,無法保證你要讀取的數據庫在某一指定的位置或者數據中心或者某一指定的設備上,”Day說,“因此,最終你只能使用最基本的SQL查詢語句,而很多存儲過程由于與數據庫的具體類型密切相關而不能使用。”
另外,Day補充說,Azure的存儲引擎也與微軟規劃中的SQL Server的云版本SQL數據服務(SQL Data Services)有很大區別,因此,開發人員需要了解自己到底是在使用哪個數據庫引擎。例如,Azure把一個1MB的文件作為一個Blob類型的數據保存,而SQL Server中會把這個文件保存在一張表(table)中。
開發云機算應用與普通應用在訪問數據庫時有明顯區別的并不僅僅只有Azure,使用Google App Engine時也有同樣的問題。
Google的App Engine產品經理Pete Koomen介紹說:“Google App Engine不僅對實際的物理硬件進行了抽象,而且對關于設備的所有概念都進行了抽象。”這保證了開發人員把代碼上傳到Google以后,Google可以把這些代碼和數據庫分開管理。“因為Google把其中的很多流程都實現了自動化,因此,開發人員必須遵循一定的規則,這些規則與我們以前在傳統的SQL模式下的規則有很大區別。”
在使用App Engine時,開發人員把那些要長期保存的數據存儲在Google的大表(Big Talbe)。“大表不是SQL數據庫。我們之所以使用大表而不用SQL數據庫,原因在于SQL數據庫要支持很多功能(例如Join功能),這使得我們要把一個數據庫放到多臺服務器上運行非常困難。”
“在使用我們的系統開發云計算應用時,我們會提供一個編程模型,并從一開始就鼓勵程序員們采用一些反常規的方式,比如,開發人員會在一次存儲過程中把數據分散保存在多個位置。”他說,這樣做的好處是保證應用程序在執行查詢時效率非常高。
Koomen對在云環境中使用關系型數據庫持反對態度。他說:“我們發現在訪問量很大的情況下,關系型數據庫非常難于管理,為了解決高訪問量帶來的一系列問題,程序員不得不投入大量的時間和精力。”
必須習慣于變化
咨詢公司Model Metrics曾幫助客戶在Salesforce.com和其他一些平臺上部署了云應用。它們發現開發云計算應用和B/S應用開發的一個主要區別是,“云上的應用改變要快得多。” Model Metrics的CTO John Barnes說,“例如,Salesforce.com一年要出好幾次新的版本,每個新版本中很可能都會有值得一用的新功能和新特性。”
Barnes建議,“作為一名云應用的開發人員,你必須在技術上與云平臺保持一致,必須關注很多技術博客,也要積極參加一些網絡研討會。”
開發人員還應該了解不同的設計模式,例如最終一致性(Eventual Consistency,最終一致性是一種一致性的模型,用于并行編程,例如分布式共享內存和分布式交易。最終一致性指的是,在一個較長的時間內,如果沒有更新的話,所有的更新都會在系統內部進行傳播,最終保證所有數據的拷貝都是相同的—編者注)。 采用這種設計模式時,如果程序對數據進行了修改,也許要在幾毫秒之后才能在數據庫中反應出來,“這種設計模式帶來的結果是,很可能從數據庫中取出的不是最新的值,”Barnes說,“由于諸如此類的原因,程序員開發云計算應用時編程方式會有一些不同。”#P#
系統管理變簡單
對程序員而言,并不是說云只是帶來麻煩,在云環境中,也有些事情變得簡單了。
Barnes說:“比如,云提供的利用Web服務來組裝應用程序的松耦合方法就把云變成了一個相對輕松的開發平臺。”
這保證了開發云計算人員可以把精力集中在創新和業務邏輯上,而不用像以前一樣,要在一些基礎性和輔助性的工作上浪費時間(如要關心操作系統和硬件的配置等問題)。例如,Salesforce.com的云開發平臺Force.com就提供了安全、工作流、系統管理和負載均衡方面的功能。
Model Metrics有一個客戶最初決定在微軟的.Net平臺上開發一個大學生管理系統,后來發現如果改在Force.com上開發,其開發成本可能只需要原來的1/3~1/4,因為Force.com有很多現存的功能模塊可以利用。
兼顧可能的遷移
無論如何,開發者必須牢記開發云應用與傳統的套裝軟件的區別。Barnes說,對云的開發人員而言,還有一個值得留意的是,開發云應用時要注意不同云有不同的定價方法。
Salesforce.com開發者市場部副總裁Adam Gross還提醒那些準備在云平臺上開發應用的開發人員說,需要了解他所選擇的平臺提供了哪些功能、有哪些特點,以便為將來的遷移做準備,“開發人員在開發云應用的第一天就要考慮到這個問題,應該盡量選擇云平臺上的那些非專有的技術和功能,以保證有一天能夠順利地從這個平臺遷移到另一個云平臺。”
Koomen對此也表示認同,他說:“Google支持流行的Python語言和Django Web框架,這就在一定程度上保證了應用的可移植性。不僅如此,Google現在正在開發開源的上傳和下載工具,來讓用戶方便地把數據上傳到App Engine中或者把數據從App Engine中下載下來。”
【編輯推薦】