SQL Server通过公司分布式缓存共享运行时数据

成千成万小卖部都结合使用 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 磁盘)上囤积该分区的备份。

今昔的应用程序与过去相比较具有更高的意义必要。
它们须求以更具合作性的点子来共享数据以及互动相互。
它们不仅需求速度快捷,同时还要知足极高负荷须求,以幸免误伤质量和可扩大性。
而且,它们必须跨三个阳台举行操作,使 .NET 应用程序可以透明而使得地与
Java 应用程序合营。 公司分布式缓存可支持大家完成上述所有目的。

Iqbal Khan 是 Alachisoft
(alachisoft.com)
的总经理和技巧推广者,该商家提供的 Ncache(.NET
分布式缓存)可拉长公司应用程序的性质和可扩张性。Khan 于 1990
年得到印第安那高校的电脑科学学士学位。您可以经过电子邮件与她交换:iqbal@alachisoft.com

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

相关文章