天天看點

一起談.NET技術,雲計算和資料

這篇部落格對在雲計算解決方案中操作資料進行總覽性的介紹。

對于絕大多數解決方案而言,資料都是至關重要的一部分。在雲計算裡面,絕大多數現成的建議都可以直接拿來用。但是雲計算也有其獨特之處。這篇部落格将讨論以下兩個用例:

将你存放在雲中的資料釋出至全世界

在雲端的項目中使用你本地的資料。

無論是哪種用例,這些建議都是通用的。

在SOA的世界中,最重要的一個概念就是契約(contract)。在雲計算的世界中,有關通信的最重要的概念也是契約。當一個契約被很多雲計算解決方案使用之時,我們就可以把它稱作一個拓撲了。

現在我們隻讨論資料通信。如果你選擇了微軟的解決方案,我們推薦你使用Open Data Protocol (OData)。OData是基于諸如HTTP和AtomPub的國際标準建立的,它提供了一個跨平台的資料通信的方案。如果你雲端的程式使用OData來釋出資料,這個世界上的任何一個程式,隻要是支援OData标準,就都能享用你的資料。同理,你雲端的程式也能使用OData來通路你本機的資料。

很多目前的微軟産品已經在應用OData了。例如:windows Azure Table Storage,Dallas,SharePoint 2010,SQL Server 2008 R2,等等。

如果你打算使用其他的拓撲,有必要仔細思考它們的可伸縮性,有多少人在使用它們,等等。

既然拓撲已標明,下一步就是選擇一門技術來實作這個拓撲了。

如果你選擇了微軟的解決方案,我們推薦你使用WCF來處理所有程式間的通信。針對資料通信,WCF Data Services自然是最好的選擇。

首先,WCF Data Services是WCF服務,是以你可以使用所有現有的WCF知識。其次,WCF Data Services已經實作了OData拓撲,于是你可以緻力于你的資料格式在你的程式中的表示,而不是AtomPub/JSON這些真正在網絡上傳遞的資料格式。再有,WCF Data Services緻力于資料傳輸,而不是資料存儲。你的資料可以存放在任何位置:本地的資料庫,雲端的資料庫,外部的web services,xml檔案,等等。無論資料是怎麼來的,你都可以用同樣的方式來釋出/使用它們。

如果你選擇了其他技術,有必要仔細考慮使用該技術的需要花費多少精力來完成你的解決方案,該技術能否提供将來的解決方案擴充,等等。

接下來我們來看看微軟的産品如何幫助你們完成上述兩個用例。

許多雲計算解決方案都不是孤立的,它們需要和外部世界互動。說到資料,你很可能直接了當的反應出來DaaS (Data as a Service,資料即服務)。

雲計算的資料可以存放在許多地方,而且資料本身也是非常多樣化的。本文将緻力于讨論結構化的資料(例如xml),以及關系型資料(例如關系資料庫)。目前微軟提供了兩大産品用于在雲中存放資料。

Windows Azure Table Storage:用于存儲結構化資料。使用動态架構 (dynamic schema)。

SQL Azure:用于存儲關系型資料。使用靜态架構(fixed schema)。

下面這張表格比較了靜态架構和動态架構各自的優勢。

靜态架構

動态架構

關系型資料庫,例如SQL Azure

Windows Azure Table Storage

經過了幾十年驗證的可靠架構

高度可擴充性(統一的存儲,但是不同的程式可以使用不同的資料結構)

可以使用許多現成的工具

基于OData Web 協定

可以使用O/R Mapping友善的在OO程式設計語言中操作資料

展現出了動态語言(dynamic languages)的優勢

針對你具體的場景,請選擇一個合适的資料存儲方式。通常來說,如果你的服務對外部世界開放了寫的權限(允許外部世界更新資料),動态架構是一個比較好的選擇,因為第三方的程式很有可能需要适當的修改你提供的資料結構。然而目前Windows Azure Table Storage還有一些局限性,它并未實作OData所有的功能,再加上關系模型已經有了好幾十年的經驗,你的開發人員也很可能非常熟悉關系模型,是以如果對你而言使用動态架構成本太高,請選擇靜态架構。

無論你選擇了何種架構,OData和WCF Data Services都能起到非常大的作用。

剛才已經說過,WCF Data Services可以使用任意的資料源。它預設就提供了兩種資料提供者:ADO.NET Entity Framework (EDM)和LINQ to SQL (L2S)。如果你使用的是這兩種資料源,通常隻需要寫一小部分代碼即可完成一個項目。如果你選擇SQL Azure存放資料,你就可以使用EDM和L2S做資料源。

Windows Azure Table Storage本身也是使用OData拓撲,是以你可能會試圖讓你的客戶直接通路你的資料源。但是在絕大多數的場合下,請不要這樣做。你必須竭盡全力保護你的storage賬号的key(把它想象成你的密碼)。如果你将自己的密碼給與一個受你信任的使用者使他/她能直接通路你的Table Storage,而他/她濫用了這份權限,到最後,使你必須支付你的storage賬号的費用。我們推薦使用者将資料和業務邏輯封裝成服務,使用WCF Data Services就是完成這一任務的很好選擇。

另一個常見的場景就是在雲端的項目中使用你本地的資料了。絕大多數場合下,這些資料都使用了靜态架構存儲于關系型資料庫中(例如SQL Server),是以你通常不會考慮如何存儲資料。在這個場景中,你更關心的是可連接配接性以及安全性。

很多公司都有防火牆和NAT。很難找到一台機體,既可以自internet通路,又擁有一個固定的IP位址,是以要在雲端的程式直接連本地資料庫也就很難了。權限控制也是一個問題。雲端的程式并不在你的公司的區域網路中,和資料庫不在同一個域裡,要使用內建Windows驗證是不可能的,而federated驗證目前還沒有針對資料庫提供很好的解決方案。

為了解決第一個問題,微軟提供了Windows Azure platform AppFabric Service Bus。Service Bus就好比你本機服務和雲端程式之間的橋梁,本地服務對于Service Bus而言其實是一個用戶端,是以即使本地伺服器位于NAT之後,它還是可以和Service Bus交流。Service Bus會把你雲端程式發送的消息傳達給你本地的服務。

Service Bus同時支援TCP和HTTP。大多數防火牆至少是允許outbounding連接配接通過80/443端口的,而這也正是Service Bus的最低需求。這樣一來,Service Bus便可以穿越NAT和防火牆。

安全是一個很複雜的話題,本文不準備詳細探讨。但是有必要指出,Windows Azure platform AppFabric Access Control在很多場合下都是很有幫助的,而且它預設就和Service Bus內建。

當然,OData和WCF Data Services在這個用例中也很有幫助。