通过企业分布式缓存共享运行时数据
許多企業都結合使用 Microsoft .NET Framework 和 Java 應用程序,尤其是那些出于各種考慮不能只依賴于單一技術的大中型企業。 通常,企業采用 Web 應用程序、面向服務的體系結構 (SOA) Web 服務以及其他服務器應用程序來處理大量事務。
其中很多應用程序在運行時需要相互共享數據。 通常,這些應用程序全都是對數據庫中所存儲的常用業務數據進行操作。 它們面對的一般是連續數據流(如金融交易應用程序),而且需要在運行時多次處理數據并與其他應用程序共享結果。
雖然數據庫是永久存儲數據的主要存儲區,但并不太適合運行時數據共享。 其中一個原因在于,從數據庫讀取數據時不能始終保證高性能。 再者,在處理事務方面數據庫的擴展性并不好,因此很可能很快會成為瓶頸,并降低依賴于它的所有應用程序的速度。
此外,也無法實時、有效地共享數據。 實時數據共享要求一旦某個應用程序更新了數據,則對該數據感興趣的其他所有應用程序都應當立即收到通知。 同樣,某些應用程序可能正等待某些數據類型被創建并可用,一旦這些操作發生,這些應用程序應當立即收到通知。
不論需要共享數據的那些應用程序是全都基于 .NET Framework,還是有一部分基于 .NET 而另一部分基于 Java,這都是常見問題。 事實上,如果應用程序混合采用 .NET 和 Java,問題會更嚴重,因為對于此類應用程序而言,在應用程序層面上根本沒有以本機形式共享數據的自動方法。
解決方案:企業分布式緩存
幸運的是,企業分布式緩存可以解決這些問題。 這種內存中存儲可跨越多個服務器,將服務器的內存集中在一塊,因而內存存儲容量是可擴展的。 事務容量也變得可擴展,添加的服務器越多,能夠處理的事務負載越大。
企業分布式緩存還提供了事件通知機制,應用程序在更新數據后可以相互通知。 由此,您可以擁有異步事件通知機制,其中一個應用程序生成數據,其他應用程序可以使用該數據,從而創建了生產者/使用者模型或發布/訂閱模型。 多個應用程序可訂閱某些數據類型,當該數據發布時這些應用程序將收到通知。
還有一種通讀/通寫機制,即企業分布式緩存本身可以從數據源和應用程序讀取大量數據。 無論應用程序是基于 Java 還是 .NET,其代碼都可以變得更簡單,因為可以從企業分布式緩存中讀取數據, 而無需嵌入數據庫訪問代碼。 圖 1 是一個使用企業分布式緩存的 .NET Framework 應用程序的簡單示例。
圖 1 使用企業分布式緩存的 .NET 應用程序
????????? using System;...????????? using Alachisoft.NCache.Web.Caching;?namespace Client{? class Program? {??? static string _sCacheName = "myAppCache";??? static Cache _sCache = NCache.InitializeCache(_sCacheName);???? static void Main(string[] args)??? {????? string employeeId = "1000";????? string key = "Employee:EmployeeId:" + employeeId;??????????? ????? // First check the cache for this employee????? Employee emp = _sCache.Get(key);?????? // If cache doesn't have it then make database call????? if (emp == null)????? {??????? emp = LoadEmployeeFromDb(employeeId);???????? // Now add it to the cache for next time??????? _sCache.Insert(key, emp);????? }??? }? }}???????除此之外,企業分布式緩存可以根據其他第三方應用程序對數據庫所做的任何數據更改進行同步。 它與數據庫之間存在連接,因此只要數據庫中某個數據類型發生變化,便會收到通知。 圖 2 給出了 .NET 和 Java 應用程序如何在運行時通過企業分布式緩存相互共享數據的圖解說明。
圖 2 .NET 和 Java 應用程序通過分布式緩存共享數據
.NET 和 Java 應用程序共享數據
借助企業分布式緩存,多個應用程序(不論是基于 .NET 還是 Java)可以訪問同一個緩存并通過緩存共享數據。 如果只是 .NET 應用程序(或只是 Java 應用程序)通過分布式緩存共享數據,則應用程序可以將對象存儲為本機二進制格式并對其進行序列化/反序列化。 但如果是兩種類型的應用程序之間相互共享數據,則需要將數據以可移植數據格式存儲在分布式緩存中。
這是因為當 .NET 應用程序在分布式緩存中存儲對象時,實際上會將對象轉換為 XML 文檔并存儲該 XML。 另一方面,當 Java 應用程序從分布式緩存讀取該數據時,會將 XML 轉換為 Java 對象。 實際上,XML 被用作可移植數據存儲機制,因為 .NET 對象被轉換為 XML,然后又從 XML 轉換為 Java,反之亦然。
有許多開放源代碼庫可以幫助您將 .NET 或 Java 對象轉換為 XML,然后轉換回對象格式。 當然,您也可以自己開發,不過我建議您選擇開放源代碼庫。 我個人比較喜歡 Carlos Jaimez 和 Simon Lucas 開發的 Web Objects in XML(WOX,woxserializer.sourceforge.net)。 本文中將使用摘自其網站的 Java 到 .NET 轉換示例(已征得他們同意)。 圖 3 顯示了采用 Java 和 C# 定義的 Student 和 Course 類。
圖 3 用 Java 和 C# 編寫的 Student 和 Course 類
????????? // Java classespublic class Student{? private String name;? private int registrationNumber;? private Course[] courses;}public class Course{? private int code;? private String name;? private int term;}?// ***************************************************// .NET classes in C#public class Student{? private String name;? private Int32 registrationNumber;? private Course[] courses;}public class Course{? private Int32 code;? private String name;? private Int32 term;}???????如果我們使用 .NET 和 Java 應用程序將以上 Student 和 Course 對象存儲在企業分布式緩存中,那么隨后可以使用 WOX 庫將這些對象轉換為 XML。 之后,如果應用程序想要從企業分布式緩存中讀取這些對象,則再次讀取 WOX 庫,將 XML 轉換回 Java 或 .NET 對象格式。 圖 4 顯示了轉換為 XML 格式的 Student 和 Course 類。
圖 4 轉換為 XML 的 Java 和 .NET 類
????????? <object type="Student" id="0">? <field name="name" type="string" value="Carlos Jaimez"/>? <field name="registrationNumber" type="int" value="76453"/>? <field name="courses">??? <object type="array" elementType="Course" length="3" id="1">????? <object type="Course" id="2">??????? <field name="code" type="int" value="6756"/>??????? <field name="name" type="string" ????????? value="XML and Related Technologies"/>??????? <field name="term" type="int" value="2"/>????? </object>????? <object type="Course" id="3">??????? <field name="code" type="int" value="9865"/>??????? <field name="name" type="string" ????????? value="Object Oriented Programming"/>??????? <field name="term" type="int" value="2"/>????? </object>????? <object type="Course" id="4">??????? <field name="code" type="int" value="1134"/>??????? <field name="name" type="string" value="E-Commerce Programming"/>??????? <field name="term" type="int" value="3"/>????? </object>??? </object>? </field></object>???????在您的應用程序中,應當從緩存層或數據訪問層調用 WOX。
基于項的事件通知
事件通知機制功能強大,多個應用程序(.NET 和 Java)可通過該機制協調異步數據共享。 在該機制的幫助下,應用程序可避免執行代價高昂的數據庫輪詢。 該機制可在 .NET 和 Java 應用程序間共享,因此能無縫地相互通知。
事件通知的一個常用類型即基于項的通知。 在此類型中,應用程序登記感興趣的各個緩存項密鑰(可能已存在,也可能尚未存在于緩存中),只要任何人因任何原因在分布式緩存中添加、更新或刪除了該項,應用程序都將分別收到通知。 例如,即使某項由于到期或被逐出而遭刪除,也將觸發項刪除事件通知。
.NET 和 Java 應用程序都可以登記對相同緩存項的興趣,并接收有關該項的通知。 通知中通常還包括受影響的緩存項,如上一部分中所述,這些項將根據應用程序的類型轉換為 .NET 或 Java 格式。
應用程序生成的自定義事件通知
對于 .NET 和 Java 應用程序,企業分布式緩存同時也是強有力的事件傳播平臺。 與企業分布式緩存相連的任何應用程序都可以在緩存中觸發自定義事件,而后,不論應用程序位于何處,只要登記了對這些自定義事件感興趣,那么都會收到緩存的通知。 這本身就在企業分布式緩存中提供了一個強有力的獨立于語言和平臺的事件傳播機制。
應用程序可借助該功能協調異步數據共享。 例如,如果某個應用程序將數據放入分布式緩存中,然后觸發一個自定義事件,計劃以后使用或處理該數據的其他應用程序將立即收到通知。
基于連續查詢的事件通知
基于項的事件通知雖然功能強大,但是要求應用程序知曉緩存項的密鑰。 如果將基于項的事件通知與企業分布式緩存中經常提供的其他分組功能(如標記、組/子組等)結合使用,那么幾乎可以處理需要根據各個緩存項所發生的情況通知應用程序的所有情況。
不過,基于項的事件存在兩個限制。 首先,前面提到過,應用程序必須知曉想要收到通知的所有緩存項的密鑰。 其次,不論這些項有何變化,應用程序都將收到通知。 應用程序無法設定更詳細的標準,以便僅在數據發生特定變化時才收到通知。
為應對此類情況,企業分布式緩存提供了連續查詢,這是一種類似 SQL 的查詢,可捕獲應用程序所感興趣數據的相關業務規則。 連續查詢并非搜索查詢,而是企業分布式緩存保持的某種“標準”。只要分布式緩存中添加或更新了內容,便會將該操作與連續查詢標準進行比較。 如果標準匹配,則觸發事件,并通知發布連續查詢標準的應用程序。
通過連續查詢,應用程序可以等待更復雜的更改,并僅當發生這些更改時才收到通知。
通讀和通寫處理程序
很多時候,應用程序嘗試讀取的數據并不在企業分布式緩存中,必須從數據庫中讀取。 此時,應用程序可以直接訪問數據庫并讀取該數據,但這意味著所有應用程序都必須復制相同的數據訪問代碼(尤其是在 .NET 和 Java 中)。 或者,也可以在需要數據時,要求企業分布式緩存為其從數據庫中讀取該數據。
有了通讀/通寫功能,企業分布式緩存可從數據源直接讀取數據。 應用程序可簡化其代碼,從而無需訪問數據庫。 它們只需要求企業分布式緩存為其提供數據,如果緩存中無該數據,則訪問數據源并讀取該數據。 圖 5 顯示了企業分布式緩存是如何使用通讀和通寫功能的。
圖 5 通讀/通寫的使用原理
有一點需要注意。 雖然讓分布式緩存從數據庫讀取數據有很大的好處,但仍有許多數據類型最好由應用程序直接從數據庫讀取。 如果要讀取的是包含復雜聯接的數據集,那么最好由應用程序親自讀取,然后將其放入分布式緩存中。
數據庫同步
由于大量數據被放入了企業分布式緩存中,因此必須確保這些數據與主數據源(通常為關系數據庫)保持同步才有意義。 企業分布式緩存提供了此功能。
通過數據庫同步功能,應用程序可以指定緩存項與數據庫表中行之間的關系(依賴關系)。 只要數據庫中的數據發生更改,數據庫服務器便會觸發 .NET 事件(即使是 SQL Server 2005/2008 數據庫),并將此更改通知企業分布式緩存。 對于不支持 .NET 事件的其他數據庫,企業分布式緩存也提供了可配置的輪詢,以便分布式緩存可以輪詢數據庫(比如每隔 15 秒鐘一次),并在數據更改時進行同步。
隨后分布式緩存將從緩存中刪除該數據,或讀取該數據的全新副本(如果配置了通讀功能)。 圖 6 顯示了企業分布式緩存與 SQL Server 是如何同步的。
圖 6 分布式緩存中的數據庫同步
高可用性:自修復動態群集
企業分布式緩存可用作多個應用程序之間的運行時數據庫共享平臺(.NET 到 .NET、.NET 到 Java 以及 Java 到 Java)。 很多情況下,這些應用程序對于您的公司而言至關重要。
由于許多關鍵任務應用程序都依賴于企業分布式緩存,因此分布式緩存必須具備高可用性。 企業分布式緩存不能癱瘓或停止工作,并且應當完全不需要停機以進行維護或其他正常操作。
企業分布式緩存通過可自修復的動態緩存服務器群集來實現高可用性。 此處的自修復表示群集清楚其所有成員,當有成員離開或加入時會動態調整。 此外,還可以確保數據是重復的以保證可靠性,并且如果有群集成員離開,其備份數據可自動供應用程序使用。 所有這些功能必須迅速執行,且不會對使用企業分布式緩存的應用程序造成任何中斷。
可擴展性:緩存分區和復制
使用企業分布式緩存的許多應用程序都是高事務應用程序。 因此,緩存群集上的負載會迅速增長。不過,如果企業分布式緩存的響應時間延長,其價值會大打折扣。 事實上,在一定范圍內,企業分布式緩存要優于關系數據庫。由于它可以在動態群集中添加更多的服務器,因而每秒處理的事務要比數據庫多得多。 但除非分布式緩存中的數據以智能方式存儲,否則無法實現可擴展性。 這一點可通過數據分區來實現,每個分區進行復制以保證可靠性。
多虧了企業分布式緩存,您可以采用分區拓撲來進行擴展。 圖 7 顯示了分區復制拓撲。
圖 7 用于可靠擴展的分區復制拓撲
企業分布式緩存會對緩存中存儲的所有數據自動進行分區。 每個分區存儲在不同服務器上,同時在另一臺服務器上創建和存儲該分區的備份。 這確保了即使任何服務器停機,數據也不會丟失。
總之,您可以采用分區技術在動態群集中添加更多的緩存服務器以擴大存儲容量,隨著服務器的增多,每秒處理的事務量也將提高。 并且,復制確保了數據的可靠性,因為服務器停機不會造成數據丟失。
功能與協作
總而言之,企業分布式緩存是高事務 .NET 和 Java 應用程序相互共享數據的理想途徑。 其強大的事件傳播機制,包括基于項的事件通知、應用程序生成的自定義事件通知和基于連續查詢的事件通知,確保了實時共享數據。
就設計而言,企業分布式緩存不僅速度飛快,而且是可擴展的。 高速度源自在內存中進行操作。 可擴展性源自能添加多臺服務器。 它對實際存儲進行分區,并將每個分區存儲在不同服務器上,同時在另一臺服務器(如 RAID 磁盤)上存儲該分區的備份。
如今的應用程序與過去相比有著更高的功能要求。 它們需要以更具協作性的方式來共享數據以及彼此互動。 它們不僅需要速度飛快,同時還要滿足極高負載需求,以避免損害性能和可擴展性。 而且,它們必須跨多個平臺執行操作,使 .NET 應用程序可以透明而有效地與 Java 應用程序合作。 企業分布式緩存可幫助我們達成以上所有目標。
Iqbal Khan 是 Alachisoft (alachisoft.com) 的總裁和技術推廣者,該公司提供的 Ncache(.NET 分布式緩存)可提高企業應用程序的性能和可擴展性。Khan 于 1990 年獲得印第安那大學的計算機科學碩士學位。您可以通過電子郵件與他聯系:iqbal@alachisoft.com。
原文鏈接:http://msdn.microsoft.com/zh-cn/magazine/gg232763.aspx
轉載于:https://www.cnblogs.com/shanyou/archive/2012/06/19/2555386.html
總結
以上是生活随笔為你收集整理的通过企业分布式缓存共享运行时数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Algorithm Course Rev
- 下一篇: SVN中检出(check out) 和