透过公司分布式缓存共享运营时数据

当 .NET 应用程序将目的转换为 XML 文档并储存该 XML。实际上,XML
被当作可移植数据存储机制,因为 .NET 对象被撤换为 XML,然后又从 XML
转换为 Java,反之亦然。

过多商店都结合使用 Microsoft .NET Framework 和 Java
应用程序,特别是那几个由于各类考虑不可以只依靠于单纯技术的大中型集团。
日常,集团运用 Web 应用程序、面向服务的连串布局 (SOA) Web
服务以及别的服务器应用程序来拍卖多量工作。

Carlos Jaimez 和 Simon Lucas 开发的 Web Objects in
XML(WOX,woxserializer.sourceforge.net)就是一个形成此项职务的开源项目。

里面不少应用程序在运转时索要相互共享数据。
寻常,这么些应用程序全都以对数据库中所存储的常用业务数据开展操作。
它们面对的貌似是连接数据流(如金融交易应用程序),而且亟需在运转时屡屡处理数据并与其余应用程序共享结果。

上边是摘自其网站的 Java 到 .NET 转换示例。下边是使用 Java 和 C# 定义的
Student 和 Course 类。

即便数据库是恒久存储数据的基本点存储区,但并不太适合运转时数据共享。
其中3个缘由在于,从数据库读取数据时不可以始终有限支撑高质量。
再者,在处监护人务方面数据库的扩充性并不佳,由此很只怕很快会成为瓶颈,并降低器重于它的兼具应用程序的速度。

图 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;}        

任由必要共享数据的那1个应用程序是清一色基于 .NET
Framework,如故有一对基于 .NET 而另一片段基于 Java,那都以广泛难题。
事实上,假如应用程序混合使用 .NET 和
Java,难题会更严重,因为对此此类应用程序而言,在应用程序层面上一向没有以本机格局共享数据的自行格局。

假如大家采取 .NET 和 Java 应用程序将上述 Student 和 Course 对象使用 WOX
库将那些目的转换为 XML。
之后,倘诺应用程序想要从XML读取这个目标,则再度读取 WOX 库,将 XML
转换回 Java 或 .NET 对象格式。上边是更换为 XML 格式的 Student 和 Course
类。

缓解方案:集团分布式缓存

有幸的是,公司分布式缓存可以化解这个标题。
那种内存中存储可超越两个服务器,将服务器的内存集中在一块儿,因此内存存储体量是可伸张的。
事务容积也变得可增加,添加的服务器更多,可以处理的事务负载越大。

商厦分布式缓存还提供了轩然大波通报机制,应用程序在立异数据后可以并行通报。
因此,您可以具备异步事件通报机制,其中1个应用程序生成数据,其他应用程序可以行使该数额,从而开创了劳动者/使用者模型或公布/订阅模型。
七个应用程序可订阅某个数据类型,当该数量发表时那一个应用程序将接收布告。

还有一种通读/通写机制,即集团分布式缓存自个儿可以从数据源和应用程序读取多量多少。
无论应用程序是依照 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
应用程序如何在运维时通过集团分布式缓存互相共享数据的图解痉达。

图片 1.png)

图 2 .NET 和 Java 应用程序通过分布式缓存共享数据

转换为 XML 的 Java 和 .NET 类

.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。

 <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>        

基于项的风浪通报

事件通报机制功用强大,多少个应用程序(.NET 和
Java)可由此该机制协调异步数据共享。
在该机制的协理下,应用程序可幸免执行代价高昂的数据库轮询。 该机制可在
.NET 和 Java 应用程序间共享,因而能无缝地相互通报。

事件通报的三个常用项目即基于项的关照。
在此类型中,应用程序登记感兴趣的相继缓存项密钥(大概已存在,也或然没有存在于缓存中),只要任何人因任何原因在分布式缓存中丰硕、更新或删除了该项,应用程序都将各自接受通知。
例如,尽管某项由于到期或被逐出而遭删除,也将触发项删除事件通报。

.NET 和 Java
应用程序都足以挂号对相同缓存项的趣味,并接收有关该项的关照。
通告中国和扶桑常还包涵受影响的缓存项,如上一些中所述,那一个项将基于应用程序的类型转换为
.NET 或 Java 格式。

在你的应用程序中调用 WOX将XML转换为.NET或是Java对象。

应用程序生成的自定义事件通报

对此 .NET 和 Java 应用程序,集团分布式缓存同时也是无往不胜的事件传播平台。
与商行分布式缓存相连的别样应用程序都可以在缓存中触发自定义事件,而后,不论应用程序位于何处,只要登记了对这几个自定义事件感兴趣,那么都会接受缓存的文告。
那自己就在商家分布式缓存中提供了三个有力的独门于言语和平台的风浪传播机制。

应用程序可凭借该意义协调异步数据共享。
例如,假设某些应用程序将数据放入分布式缓存中,然后触发2个自定义事件,安排之后使用或处理该数据的其余应用程序将及时接受通知。

依据两次三番查询的事件通报

基于项的轩然大波通报固然成效强大,然则需要应用程序知晓缓存项的密钥。
假如将基于项的事件通报与信用社分布式缓存中时时提供的其他分组效能(如标记、组/子组等)结合使用,那么大致可以处理必要基于各类缓存项所爆发的情事通报应用程序的全部意况。

可是,基于项的事件存在多少个限制。
首先,前边提到过,应用程序必须知道想要收到通知的享有缓存项的密钥。
其次,不论那些项有啥变化,应用程序都将收到公告。
应用程序无法设定更详实的规范,以便仅在数量爆发一定变化时才收到文告。

为应对此类意况,公司分布式缓存提供了连年查询,那是一种类似 SQL
的查询,可捕获应用程序所感兴趣数据的相干作业规则。
屡次三番查询并非搜寻查询,而是公司分布式缓存保持的某种“标准”。只要分布式缓存中丰裕或更新了内容,便会将该操作与三番五次查询专业开展相比。
尽管标准分外,则触发事件,并通报发表连接查询专业的应用程序。

通过两次三番查询,应用程序能够等待更扑朔迷离的变更,并仅当爆发那几个改变时才接到公告。

通读和通写处理程序

多多时候,应用程序尝试读取的数据并不在集团分布式缓存中,必须从数据库中读取。
此时,应用程序可以一向访问数据库并读取该多少,但这代表全数应用程序都无法不复制相同的多少访问代码(越发是在
.NET 和 Java 中)。
或许,也足以在急需多少时,要求商户分布式缓存为其从数据库中读取该数量。

有了通读/通写功用,集团分布式缓存可从数据源间接读取数据。
应用程序可简化其代码,从而无需访问数据库。
它们只需必要公司分布式缓存为其提供数据,借使缓存中无该数额,则做客数据源并读取该多少。
图 5 呈现了企业分布式缓存是怎么样接纳通读和通写功能的。

图片 2.png)

图 5 通读/通写的使用原理

有几许亟待专注。
固然让分布式缓存从数据库读取数据有很大的便宜,但仍有众多数据类型最好由应用程序直接从数据库读取。
尽管要读取的是含有复杂连接的数据集,那么最好由应用程序亲自读取,然后将其放入分布式缓存中。

数据库同步

由于大批量数目被放入了公司分布式缓存中,由此必须保险这么些数据与主数据源(日常为关周全据库)保持同步才有含义。
公司分布式缓存提供了此效用。

透过数据库同步效率,应用程序能够指定缓存项与数据库表中行之间的涉及(看重关系)。
只要数据库中的数据产生变更,数据库服务器便会触发 .NET 事件(尽管是 SQL
Server 二零零七/二〇一〇 数据库),并将此更改布告集团分布式缓存。 对于不支持.NET
事件的此外数据库,集团分布式缓存也提供了可陈设的轮询,以便分布式缓存可以轮询数据库(比如每隔
15 分钟三次),并在数码变动时开展同步。

随后分布式缓存将从缓存中去除该数量,或读取该数量的崭新副本(倘诺布置了通读功用)。
图 6 突显了铺面分布式缓存与 SQL Server 是何许共同的。

图片 3.png)

图 6 分布式缓存中的数据库同步

高可用性:自修复动态群集

集团分布式缓存可用作多少个应用程序之间的运营时数据库共享平台(.NET 到
.NET、.NET 到 Java 以及 Java 到 Java)。
很多情景下,那么些应用程序对于你的店铺而言主要性。

出于许多最首要职责应用程序都爱抚于公司分布式缓存,由此分布式缓存必须具备高可用性。
集团分布式缓存不只怕瘫痪或终止工作,并且应当完全不需求停机以开展保证或此外常规操作。

商店分布式缓存通过可自修复的动态缓存服务器群集来贯彻高可用性。
此处的自修复表示群集清楚其负有成员,当有成员离开或投入时会动态调整。
其它,还是可以保障数量是再度的以管教可倚重性,并且只要有群集成员离开,其备份数据可活动供应用程序行使。
全部那些意义亟须连忙实施,且不会对采纳集团分布式缓存的应用程序造成其余中断。

可扩充性:缓存分区和复制

利用公司分布式缓存的广大应用程序都以高工作应用程序。
由此,缓存群集上的负载会飞速增强。可是,假如公司分布式缓存的响应时间延长,其市值会大打折扣。
事实上,在肯定限制内,公司分布式缓存要优化关周详据库。由于它能够在动态群集中添加愈来愈多的服务器,因而每秒处理的业务要比数据库多得多。
但除非分布式缓存中的数据以智能格局存储,否则不可以落成可扩大性。
那点可由此数据分区来贯彻,每一种分区进行复制以确保可看重性。

幸亏了商行分布式缓存,您可以应用分区拓扑来展开增加。 图 7
突显了分区复制拓扑。

图片 4.png)

图 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

相关文章