经公司分布式缓存共享运行时数

不少合作社都成使用 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
应用程序如何以运作时经公司分布式缓存相互共享数据的图解说明。

SQL Server 1.png)

图 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 显示了店铺分布式缓存是怎么利用通读和通写功能的。

SQL Server 2.png)

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

出几许亟需注意。
虽然于分布式缓存从数据库读取数据有好十分的利益,但仍时有发生多数据类型最好是因为应用程序直接由数据库读取。
如果如读取的凡含复杂连接的数据集,那么极端好是因为应用程序亲自读取,然后用其放入分布式缓存中。

数据库同步

由大气数目让放入了合作社分布式缓存中,因此要管这些数量和主数据源(通常也关系数据库)保持同才发含义。
企业分布式缓存提供了是作用。

透过数据库同步功能,应用程序可以指定缓存项和数码库表中行之间的涉嫌(依赖关系)。
只要数据库中之数产生反,数据库服务器即会触发 .NET 事件(即使是 SQL
Server 2005/2008 数据库),并将以此更改通知局分布式缓存。 对于未支持
.NET
事件之其他数据库,企业分布式缓存也供了而配备的轮询,以便分布式缓存可以轮询数据库(比如各级隔
15 秒钟一不行),并于数码变动时展开联合。

继而分布式缓存将从今缓存中删去该多少,或读博该数据的全新副本(如果安排了通读功能)。
图 6 显示了信用社分布式缓存与 SQL Server 是怎样共同的。

SQL Server 3.png)

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

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

合作社分布式缓存可用作多个应用程序之间的运转时数据库共享平台(.NET 到
.NET、.NET 到 Java 与 Java 到 Java)。
很多景象下,这些应用程序对于你的合作社而言要。

鉴于许多要任务应用程序都因让企业分布式缓存,因此分布式缓存必须具备高可用性。
企业分布式缓存不可知瘫痪或终止工作,并且该完全不欲停机以拓展维护或其他正常操作。

号分布式缓存通过可从修复的动态缓存服务器群集来贯彻高可用性。
此处的自修复表示群集清楚该所有成员,当有成员离开或在时会动态调整。
此外,还得保数据是更的为保证可靠性,并且只要发群集成员离开,其备份数据可机关供应用程序使用。
所有这些意义必须飞实施,且未会见指向使用企业分布式缓存的应用程序造成任何中断。

而是扩展性:缓存分区和复制

利用企业分布式缓存的博应用程序都是赛工作应用程序。
因此,缓存群集上之负载会迅速增长。不过,如果公司分布式缓存的应时间延长,其价值会大打折扣。
事实上,在肯定限制外,企业分布式缓存要优于关系数据库。由于她可当动态群集中长更多之服务器,因而每秒处理的工作要比较数据库多得几近。
但除非分布式缓存中之数码为智能方式囤,否则无法落实而扩展性。
这等同沾可经过数量分区来贯彻,每个分区进行复制以保险可靠性。

幸而了庄分布式缓存,您可以采用分区拓扑来开展扩展。 图 7
显示了分区复制拓扑。

SQL Server 4.png)

图 7 用来可靠扩展的分区复制拓扑

商家分布式缓存会对缓存中蕴藏的富有数据自动进行分区。
每个分区存储在不同服务器上,同时在任何一样高服务器上缔造同贮该分区的备份。
这包了就是其它服务器停机,数据也不会见丢。

总而言之,您可以使用分区技术于动态群集中长更多的缓存服务器因为扩大存储容量,随着服务器的长,每秒处理的事务量也拿增进。
并且,复制确保了数码的可靠性,因为服务器停机不会见招数丢失。

功效及搭档

一言以蔽之,企业分布式缓存是高工作 .NET 和 Java
应用程序相互共享数据的妙途径。
其强劲的波传播机制,包括因项的事件通报、应用程序生成的自定义事件通报及冲连续查询的轩然大波通报,确保了实时共享数据。

尽管计划而言,企业分布式缓存不仅速度很快,而且是只是扩大的。
高快来源于自在内存中展开操作。 可扩大性源自能添加多令服务器。
它对实际存储进行分区,并以每个分区存储于不同服务器上,同时在任何一样贵服务器(如
RAID 磁盘)上囤积该分区的备份。

现之应用程序SQL Server与过去比有着更胜似的职能要求。
它们要以更兼具协作性的办法来共享数据以及互动相互。
它们不但要速度很快,同时还要满足无限高负荷需求,以避免损害性及可扩展性。
而且,它们要过多只阳台实行操作,使 .NET 应用程序可以透明而行地和
Java 应用程序合作。 企业分布式缓存可帮我们达成上述所有目标。

Iqbal Khan 是 Alachisoft
(alachisoft.com)
的总裁和技术推广者,该公司供的 Ncache(.NET
分布式缓存)可增强公司应用程序的属性与可扩展性。Khan 于 1990
年获得印第安那大学的处理器对硕士学位。您得通过电子邮件与他沟通:iqbal@alachisoft.com

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

相关文章