多多商家都整合使用 Microsoft .NET Framework 和 Java
应用程序,特别是那些由于各样考虑不可能只依靠于单纯技术的大中型集团。
平日,集团选取 Web 应用程序、面向服务的系统布局 (SOA) Web
服务以及任何服务器应用程序来处理大批量作业。

其间不少应用程序在运行时需求互相共享数据。
平时,这个应用程序全都以对数据库中所存储的常用业务数据进行操作。
它们面对的形似是再三再四数据流(如金融交易应用程序),而且须要在运行时数11遍甩卖多少并与其余应用程序共享结果。

即使如此数据库是恒久存款和储蓄数据的首要存款和储蓄区,但并不太相符运维时数据共享。
个中多个原因在于,从数据库读取数据时无法一向有限支撑高品质。
再者,在处总管务方面数据库的扩张性并不佳,因而很恐怕一点也不慢会成为瓶颈,并下降依赖于它的有着应用程序的速度。

其余,也不知所措实时、有效地共享数据。
实时数据共享要求一旦某些应用程序更新了数额,则对该多少感兴趣的其它兼具应用程序都应当立刻接受通告。
同样,有些应用程序或然正等待某个数据类型被创设并可用,一旦那几个操作爆发,这么些应用程序应当立刻接受文告。

任由必要共享数据的这多少个应用程序是清一色基于 .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方应用程序对数据库所做的别的数据变动举行同步。
它与数据库之间存在连接,由此一旦数据库中某些数据类型发生变化,便会收到文告。
图 2 给出了 .NET 和 Java
应用程序如何在运营时经过公司分布式缓存相互共享数据的图阐述明。

XML 1.png)

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

.NET 和 Java 应用程序共享数据

借助于集团分布式缓存,多少个应用程序(不论是依照 .NET 依然Java)能够访问同3个缓存并经过缓存共享数据。 若是只是 .NET
应用程序(或只是 Java
应用程序)通过分布式缓存共享数据,则应用程序能够将目的存款和储蓄为本机二进制格式并对其举行类别化/反系列化。
但如若是三种档次的应用程序之间互相共享数据,则须求将数据以可移植数据格式存款和储蓄在分布式缓存中。

那是因为当 .NET 应用程序在分布式缓存中存款和储蓄对象时,实际上会将对象转换为
XML 文书档案并蕴藏该 XML。 另一方面,当 Java
应用程序从分布式缓存读取该数量时,会将 XML 转换为 Java 对象。
实际上,XML 被当作可移植数据存款和储蓄机制,因为 .NET 对象被撤换为
XML,然后又从 XML 转换为 Java,反之亦然。

有过多开花源代码库能够帮忙您将 .NET 或 Java 对象转换为
XML,然后转换回对象格式。
当然,您也能够本身支付,可是自身建议你选取开放源代码库。 作者个人相比较欣赏
Carlos 海梅z 和 西蒙 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 对象格式。 图 4XML, 显示了转移为 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 展现了协作社分布式缓存是何许运用通读和通写效用的。

XML 2.png)

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

有几许亟需小心。
尽管让分布式缓存从数据库读取数据有十分的大的功利,但仍有不少数据类型最佳由应用程序直接从数据库读取。
假设要读取的是带有复杂连接的数据集,那么最棒由应用程序亲自读取,然后将其放入分布式缓存中。

数据库同步

由于大批量数量被放入了信用合作社分布式缓存中,由此必须保障这个数据与主数据源(平日为关周全据库)保持同步才有含义。
公司分布式缓存提供了此成效。

透过数据库同步成效,应用程序能够内定缓存项与数据库表中央银行之间的涉及(注重关系)。
只要数据库中的数据发生变更,数据库服务器便会触发 .NET 事件(就算是 SQL
Server 二零零六/二零一零 数据库),并将此更改通告集团分布式缓存。 对于不匡助.NET
事件的其余数据库,集团分布式缓存也提供了可配置的轮询,以便分布式缓存能够轮询数据库(比如每隔
15 分钟3遍),并在多少变动时开始展览同步。

随着分布式缓存将从缓存中删去该数额,或读取该数额的崭新副本(假若布置了通读功效)。
图 6 显示了公司分布式缓存与 SQL Server 是如何联合的。

XML 3.png)

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

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

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

由于众多器重职务应用程序都依靠于集团分布式缓存,因而分布式缓存必须怀有高可用性。
公司分布式缓存不可能瘫痪或终止工作,并且应当完全不须要停机以举办珍贵或其余正常操作。

集团分布式缓存通过可自修复的动态缓存服务器群集来实现高可用性。
此处的自修复表示群集清楚其全体成员,当有成员离开或进入时会动态调整。
此外,仍是能够确定保障数据是重复的以确认保证可相信性,并且只要有群集成员离开,其备份数据可机关供应用程序选取。
全体这个效用必须神速执行,且不会对应用公司分布式缓存的应用程序造成任何中断。

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

行使公司分布式缓存的许多应用程序都以高工作应用程序。
因而,缓存群集上的负载会飞速增强。然而,要是集团分布式缓存的响应时间延长,其价值会大促销扣。
事实上,在大势所趋范围内,公司分布式缓存要降价关全面据库。由于它能够在动态群集中添加更多的服务器,由此每秒处理的事务要比数据库多得多。
但除非分布式缓存中的数据以智能情势存款和储蓄,不然不可能达成可扩张性。
那一点可透过数量分区来兑现,各样分区进行理并答复制以保险可相信性。

辛亏了商户分布式缓存,您能够行使分区拓扑来展开扩展。 图 7
展现了分区复制拓扑。

XML 4.png)

图 7 用于可信扩展的分区复制拓扑

店铺分布式缓存会对缓存中存款和储蓄的全部数据自动举办分区。
每一种分区存款和储蓄在区别服务器上,同时在另一台服务器上创立和仓库储存该分区的备份。
那确认保障了不畏其余服务器停机,数据也不会丢掉。

总的说来,您能够使用分区技术在动态群集中添加更加多的缓存服务器以增加存款和储蓄体积,随着服务器的加码,每秒处理的事务量也将增强。
并且,复制确定保障了数量的可相信性,因为服务器停机不会导致数据丢失。

意义与搭档

总的说来,集团分布式缓存是高级工程师作 .NET 和 Java
应用程序相互共享数据的佳绩途径。
其强劲的轩然大波传播机制,包罗基于项的事件通报、应用程序生成的自定义事件通报和依照三番五次查询的风浪通报,确认保障了实时共享数据。

就安排而言,公司分布式缓存不仅速度快捷,而且是可扩张的。
高速度源自在内部存储器中开始展览操作。 可扩大性源自能添加多台服务器。
它对实际存款和储蓄进行分区,并将每种分区存款和储蓄在不一致服务器上,同时在另一台服务器(如
RAID 磁盘)上囤积该分区的备份。

近期的应用程序与过去对照有所更高的功能供给。
它们必要以更具合营性的点子来共享数据以及互动相互。
它们不但必要速度快速,同时还要知足极高负荷须要,以幸免误伤质量和可增加性。
而且,它们必须跨三个平台实施操作,使 .NET 应用程序能够透明而卓有效率地与
Java 应用程序同盟。 集团分布式缓存可支持我们达成上述全部指标。

Iqbal Khan 是 Alachisoft
(alachisoft.com)
的老板和技术推广者,该商行提供的 Ncache(.NET
分布式缓存)可增强公司应用程序的性质和可扩张性。Khan 于 一九九零年获得印第安那学院的电脑科研生学位。您能够因此电子邮件与他联络:iqbal@alachisoft.com

原稿链接:http://msdn.microsoft.com/zh-cn/magazine/gg232763.aspx

相关文章

网站地图xml地图