云計算環境下的應用架構設計

作者: 方國偉  來源: 《程序員》  發布時間: 2013-11-13 09:53  閱讀: 6001 次  推薦: 5   原文鏈接   [收藏]  

  作者從云計算環境下應用的特點出發,分析了在云計算環境下應用程序開發設計的一些新變化。根據這些特點,本文提出一個“自我感知應用”(Self-Sensing Application)的新概念,接著以Windows Azure平臺為例闡述如何實現自我感知應用。

  多年來應用程序開發者和架構師們都在努力設計一種既能夠在功能上滿足當前業務需求,又能夠適應用戶需求發生變化或者能夠在可預見的將來適應環境變化的應用。尤其是在互聯網領域,架構師都在努力讓自己設計的應用具有比較強的擴展能力,能夠跟得上用戶不斷增長或者出現突發請求的一些情況。在傳統的Web應用設計中,我們在架構上一般采用基于多層架構的設計,在Web層中大量使用了負載均衡等技術。一般我們的處理方式都是在應用程序設計好之后,在應用部署的過程中事先把環境配置好,而應用程序在運行過程配置都是不變的。但是,隨著云計算時代的到來,我們面對一些新的挑戰,相應的應用程序設計方式隨之發生了一些變化。我們首先從云計算的技術特點開始討論應用的變化。

  從技術角度看云計算的特點

  毫無疑問,云計算是目前信息產業中討論得最多的話題。雖然大家對于云計算還沒有一致定義,但是對于云計算的一些特點,相關的服務模型等內容日漸趨于統一。在討論云計算應用架構特點之前,我們先從技術的角度來討論一下云計算本身的一些特點。

  按需服務

  云計算是一個把信息技術作為服務(IT as a Service)提供的一種方式。這種服務的概念都是從消費方(用戶)角度出發,而不是從服務提供方出發考慮問題,因此,云計算要求按需服務,即用戶可以根據需求即時得到服務。從這個角度講,云計算就像我們公共服務中的自來水、電、煤氣一樣,集中供應并按需服務和計費。

  資源池

  云計算的一個好處是提高資源的利用率,而這一般需要通過共享的方式來達到這個目的。這里可以類比一下我們日常吃飯中的自助餐和桌餐的差別。如果需要共享就需要先把資源集中到一個公共的資源池中。根據這個資源池中資源的類別,我們把云計算的服務模型分為三種,即所謂的SPI模型,如表1所示。

表1 SPI模型

表1 SPI(Software Platform Infrastructure)模型

  高可擴展性

  云計算平臺的資源池相對于單個用戶的需求而言是比較大的,因此考慮到會有大量不同用戶共用一個資源池,他們之間的資源使用模式一般存在一定的互補性,所以對于某個用戶的需求而言,云計算具有很高的擴展性。另外,云計算平臺在做架構設計的時候,都會考慮到如何讓用戶可以平滑擴展他們的資源需求,比如計算資源、存儲資源等。

  彈性服務

  彈性服務指的是云計算的資源分配可以根據應用訪問具體情況進行動態地調整。也正因如此,云計算對于非恒定需求的應用,比如需求波動很大、階段性需求等,具有非常好的應用效果。在云計算的環境中,資源的擴展方式可以分為兩大類:一類是事先可以預測的,比如一些季節性的需求;另一類是完全基于某種規則實時動態調整的。無論是哪一種,都要求云計算平臺提供彈性的服務。

圖1 自服務、自動化和虛擬化之間的關系

圖1 自服務、自動化和虛擬化之間的關系

  自服務、自動化和虛擬化

  與日常生活中的ATM等自服務類似,在云計算中自服務同樣是降低服務成本、提高服務便捷性的一種途徑。對于云計算服務提供方來說,自服務就要求提供盡量簡單的用戶操作界面,簡化用戶操作,降低用戶使用服務的難度,只有這樣自服務才能被用戶所接受。而且由于是人機交互,因此服務響應速度的要求就會更高。所有這一切都需要通過后臺自動化的方式才能實現,也就是說后臺自動化是前臺自服務的保障。因此從這個意義上來講,自服務是目的,而自動化則是手段。虛擬化的本質是解耦,是一種把資源從硬件束縛中解放出來的方式,從而使得資源的動態分配成為可能。這幾個概念的關系可以用圖1表示。

  云計算自服務一般是通過Web門戶來體現,就像在亞馬遜的云計算服務中,用戶通過自服務門戶預定需要的計算資源就像在其電子商務網站上訂購一本書一樣方便。自動化一般通過程序和大量自動化腳本來實現,使得前端自服務界面用戶觸發的操作后臺平臺能夠自動化完成,并及時響應,從而保證良好的用戶體驗。

  服務可度量

  管理學之父德魯克曾經說過一句名言:“如果你不能測量它,你就不能管理它”。云計算作為服務提供的方式,需要對服務進行度量。一般服務提供方和用戶之間需要有一個服務水平協議(SLA)。這樣對于私有云來說,可以根據服務情況進行內部費用核算。而對于公有云來說,服務可度量就是計費的前提,然后根據實際使用量來進行計費。

  云計算應用的特點

  從前面的描述我們可以看到云計算給應用程序帶來的一些挑戰,那就是應用程序如何在云計算環境下充分利用云計算平臺的一些特點來更好地滿足用戶需求。云計算應用要能夠利用云計算環境中可動態擴展的資源,構建一個具有彈性的高可用的應用程序。下面我們分別討論一下云計算環境下應用程序的特點和要求。

  自動化要求

  自動化是人類的夢想,而計算機對自動化領域的發展有著巨大的影響,它極大地提高了工作和生產效率。在云計算環境下,自動化要求實際上是對計算工作本身的一個自動化改變。云計算的自動化可以賦予用戶對平臺基礎架構的資源配置任務進行全面統籌的能力,并實現對資源的動態分配以提高管理效率、減少人為錯誤并加快用戶對資源請求的響應速度。應用程序在設計的時候要能充分利用云計算環境的自動化特性,從而使得應用程序可以在很少或沒有人工干預的情況下,自動適應需求的變化。

  分布式計算

  大部分云計算平臺都是用廉價和標準的計算機硬件構成,然后通過云計算軟件的方式在計算能力、可靠性等方面來達到傳統的大型計算機的水準。也就是說在云計算環境下,資源池通常是通過分布式軟硬件方式來實現。因此云計算應用程序的運行往往涉及到多個計算資源。無論是計算還是存儲需求,應用程序一般都會涉及到多個節點,這樣在設計的時候要考慮并行設計的思想或采用分布計算的方式。比如,有些云計算應用可以根據計算的要求,采用類似MapReduce的編程模型。

  松耦合

  無論是功能上還是性能上云計算對應用的靈活性提出了更高的要求。這就要求應用程序在設計的時候要考慮松耦合的架構。耦合度與靈活性一般是相反的,即耦合度越高靈活性越低,而耦合度越低靈活性越高。因此,在做云計算應用架構設計的時候,一般要追求松耦合的設計。比如,在做Web應用設計的時候,對于用戶狀態的保持就需要盡量采用無狀態的方式來設計,這樣應用程序的水平擴展能力比較好。

  數據存儲方式

  在傳統的應用設計中,我們一般采用關系型數據庫來存儲數據。但是在云計算環境下,尤其是對于互聯網應用,存在兩個需要面對的問題:一個是云計算環境下的數據量都比較大,傳統的關系型數據庫面臨數據擴展能力的挑戰;另一個是許多應用對于數據存儲的要求更多體現在非結構化數據或者是半結構化數據的存儲上面。因此,大多數云計算平臺都會提供針對非結構化和半結構化的數據存儲方式。這樣應用程序的架構需要針對新的數據存儲方式作出調整。

  上面描述的一些應用特點對我們開發和設計應用程序會帶來許多影響。一個是應用程序在設計的過程中不僅僅需要考慮操作系統平臺或中間件級別的編程接口,還要針對其運行的云平臺的接口來對應用程序進行設計。另外一個比較大的影響是有一些工作量從平臺產品轉移到了應用程序的開發設計人員。比如說,在采用半結構化數據存儲的時候,開發設計人員需要處理數據的一致性問題。還有,在云計算平臺上如果想要得到比較好的性能,開發設計人員往往還需要對數據的分區進行特別設計,或需要采用一些并行設計的算法等。

  具有自我感知能力的應用

  傳統的基礎架構或系統平臺中的資源都不能動態配置,因此應用程序在設計的時候主要考慮自身的業務邏輯的實現。應用程序本身的監控和管理都是通過其他系統管理軟件如System Center、Tivoli等來實現。有一些管理得比較好的應用程序,可以通過這些系統管理軟件實現部分資源的動態調整。但是,這些傳統的應用程序本身對底層平臺的運行情況是沒有任何感知的。隨著云計算的出現,應用程序本身的自動化逐漸成為可能。我把這些具有運行環境感知功能的應用程序稱之為“自我感知應用”(Self-Sensing Application)。

  自我感知應用的出現是應用程序發展的一種趨勢,是自動化在應用程序運行過程中的一種體現。在做傳統應用程序設計的時候,我們把主要的精力都放在功能性的需求方面,但是對于一些非功能性的需求往往采用手工配置和采用第三方工具的方式來實現。云計算平臺的出現使得計算平臺的資源具有可編程的特性,因此我們在應用程序的架構設計中可以通過基礎架構平臺的一些接口來感知應用程序的實際運行情況,并可以結合訪問情況對應用程序的運行資源進行動態調整,以實現完善的自動化程序運行。

  云計算平臺具有可編程的資源分配,因此我們還可以設定自動化的部署過程,也就是讓應用程序可以自動化地完成應用程序的部署、升級等工作。自動化部署也是應用程序動態擴展的一個前提。這樣當需要更多計算實例來處理更多的用戶請求的時候,新的計算實例可以動態生成出來并自動啟用。

  自我感知應用是應用程序朝著成為具有獨立、自治單元的方式發展的一種體現。應用架構師在做設計的時候,面對的是底層抽象的、幾乎無限的計算資源,而不是傳統意義上的物理資源。從另外一個角度看這種設計方式也是應用程序與底層計算平臺松耦合的一種體現,從而使得應用程序不綁定具體物理硬件。云計算平臺從底層提供幾乎無限的計算、存儲和網絡資源,其上的應用程序就像一個個具有人工智能的獨立單元,他們在完成自身業務工作之外,還能夠具有自我管理和自我修復的功能。

  Windows Azure應用程序的自我感知實現

  對于一個自我感知應用而言,一方面它要能夠感知底層運行平臺的一些環境信息,另一方面它還需要一種機制能夠把自身運行要求轉遞給底層運行環境。Windows Azure上應用程序由代碼和基于XML的配置文件兩部分組成。應用程序可以通過配置文件把自身運行要求傳遞給Windows Azure,確切地講是提交給Fabric控制器。但是,應用程序如何才能感知環境的一些變化呢?加入配置文件更新之后應用程序如何才能得到通知并作出響應呢?這里就要用到Windows Azure提供的服務運行時編程接口(Service Runtime API)。

  Windows Azure的服務運行時編程接口最常用的使用方式就是幫助應用程序了解應用服務和應用所在的Role實例的信息,包括:

  • 它能夠讓應用程序訪問在服務配置文件和服務定義文件中的最新服務配置信息。當配置文件的信息被更新的時候,服務運行時編程接口能夠保證返回最新的配置信息。
  • 它能夠應用得到最新的服務拓撲結構,比如哪些Role實例在運行,每種Role類型有多少實例等。
  • 由于Worker Role中的代碼運行周期有點類似于有限狀態自動機的處理方式,服務運行時編程接口能夠幫助應用得到Worker Role實例的生命周期信息。

  服務運行時編程接口可以通過兩種方式使用。對于.NET托管代碼,Windows Azure的SDK中包含一個名為Microsoft.WindowsAzure.ServiceRuntime.dll,當用Visual Studio新生成一個云服務項目時它會被自動引用。而對于本地代碼,可以通過使用SDK中的頭文件和庫文件就可以用C來調用這個編程接口了。

  服務運行時編程接口是應用程序本身用來得到自身及其運行環境信息用的,但是如果應用程序之外,比如說一個管理工具要得到指定應用程序的信息,那么一般需要利用另外一個稱為服務管理的編程接口(Service Management API)。這兩個編程接口在功能有重合的地方,它們之間的最大區別在于服務運行時編程接口在Windows Azure中運行,而服務管理的編程接口一般在Windows Azure之外運行,它更多的用在那些針對Windows Azure的管理工具開發當中。

  結束語

  云計算無疑已受到極大的關注,但是它還是一個相對較新的概念,相關的技術正處于快速發展的過程中。我們已經可以看到云計算對IT行業的硬件模型、應用模型和用戶體驗等方面帶來了革命性的影響。從應用模型的角度來看,云計算平臺的出現使得開發人員可以快速構建高可用的、可以幾乎無限擴展的應用。隨著云計算相關技術的進一步發展,它將使我們能夠進一步簡化開發自我感知應用的工作,另外非功能性的一些要求也將更多通過配置文件而不是代碼來實現。

  人們對于信息技術需求的發展始終沒有改變,那就是追求可靠、便捷、易用的信息應用。當我們把一個冰箱連接到電源插座的時候,我們從來不會去考慮這個電力是從哪個發電站來的,我們也不需要成為一個電力專家來使用這個冰箱。云計算的出現讓信息技術往這個方向更進了一步。我們認為應用程序將逐漸演變成具有自我感知能力的應用,成為一個能夠根據平臺環境和用戶請求進行自我調整和自我修復的自治單元。也許不遠的將來,整個互聯網就像一臺巨大的計算機,其上提供無限的計算資源和服務,人們使用其上的應用程序就像我們現在使用自來水、電力那樣方便、自然。

  參考文獻
  [1] David Chappell, Introducing Windows Azure
  [2] Peter Mell, Tim Grance, The NIST Definition of Cloud Computing
  [3] Alexander Lenk, Markus Klems, Jens Nimis, Stefan Tai, Thomas Sandholm, What’s Inside the Cloud? An Architectural Map of the Cloud Landscape, CLOUD’09, May 23, 2009, Vancouver, Canada

  作者方國偉,軟件架構資深顧問,目前在微軟開發工具及平臺事業部負責微軟云計算解決方案的技術推廣工作。曾先后擔任IBM(中國)有限公司軟件部資深軟件工程師、微軟企業和合作伙伴部制造業客戶技術經理。

5
0
 
標簽:云計算 Azure
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()