Velocity

使用分布式缓存构建更好的数据驱动应用程序

Aaron Dunnington

代码下载可从 MSDN 代码库
浏览代码联机

本文基于 Microsoft 速度的预发布版本。如更改,恕所有信息。

本文讨论:

  • 入门速度
  • 分类用于分布式缓存的数据
  • 基本的速度客户端应用程序
  • 与 ASP.NET 会话状态集成
本文涉及以下技术:
ASP.NET 的 Microsoft 速度

内容

当前的数据中心应用程序
速度可帮助
数据分类
逻辑层次结构
分区和本地缓存
配置存储
Getting Started with 速度
群集部署
基本的速度客户端应用程序
设计缓存
指定的缓存
组织缓存
组织报告
组织会话
编程缓存层
与 ASP.NET 会话状态集成
将转发

数据驱动的应用程序已成为普遍。从的源包括关系的源、 面向服务的应用程序、 联合的订阅源和以数据为中心的文档和消息的多种排列数据。应用程序体系结构继续发展为利用此大量数据可访问性。此外,基础硬件趋势和处理、 存储、 内存,和连接的技术改进已启用了应用程序结构利用低成本,商品硬件来有效地扩展这些应用程序。

新 Microsoft 项目代号为的速度提供一个分布式,而在内存缓存。速度,可以通过提供分布式客户端应用程序占用的内存的统一的视图创建可伸缩的、 可用的、 高性能应用程序。通过速度,客户端应用程序可以通过将数据移近一些逻辑使用它,从而降低基础数据存储区中的压力增强性能。速度群集提供高可用性,以进一步避免数据丢失以及在数据层上的负载增加应用程序。利用分布式的内存速度允许这些应用高性能、 可用的灵活地扩展为应用程序请求增加程序。

本文重点介绍如何速度的功能可以将利用提供下一个的可伸缩性、 可用性和新的和现有的性能级别的密钥分发.NET 应用程序。

当前的数据中心应用程序

在典型的当前数据驱动应用程序可能是店面的简单的行的内容数据库上。此应用程序使用户可以浏览产品目录和购买产品通过购物的车体验。此外,汇总的订单数据被使用若要显示顶部的销售产品如通常一起购买的产品。此应用程序体系结构执行熟悉的用户界面、 业务逻辑和数据访问,如 图 1 所示分离。此体系结构,遗憾的是,面临可伸缩性、 性能和可用性方面的几个主要挑战。

fig01.gif

图 1 典型的基于数据的 Web 应用程序体系结构

首先,有是主要的可伸缩性固有的挑战,应用程序执行目录和顶部的卖方数据检索操作的形式在每个页加载时的数据库操作。为应用程序负载增加,在数据库操作中的此高频率可能导致严重的可伸缩性限制和由于到资源和从磁盘检索数据的物理限制的增强争用的性能瓶颈。进一步,此体系结构可以极大地影响为操作通过完全传输到数据层中每个页负载结果应用程序的延迟。

如果应用程序利用传统缓存 Web 层中的方法来减少在数据库上的常量压力,第二个密钥可伸缩性出现的挑战被根在特定的服务器资源的状态的耦合。不以扩展 decoupling 从特定服务器的缓存状态,应用程序必须使用诸如粘滞的路由到绑定到相应的服务器节点的用户请求技术。这可能会导致处理用户请求的特定方面产生 disproportionally 更长的一活动的不均匀分布。

最后,Web 层节点负责缓存不传递高可用性给重点的应用程序因为它们不它协同通过一个可用性基底。

速度可帮助

如前文所述,速度将是分布式,而在内存缓存。更是具体地说速度由一起 fusing 在服务器内存公开了对客户端应用程序的统一的缓存层。体系结构包括一个环的运行速度 Windows 服务的缓存服务器的速度以及客户端应用程序利用速度客户端库与统一缓存查看 (请参见 图 2 )。

fig02.gif

图 2 速度体系结构

客户端应用程序可以访问速度缓存层,来存储和检索通过简单的放置任何可序列化 CLR 对象,并获取操作如下所示:

CacheFactory factory = new CacheFactory();
cache = factory.GetCache("catalog");

cache.Put("Product-43", new Product("Coffee"));

Product p = (Product)cache.Get("Product-43");

速度,则可以利用新的缓存层,如 图 3 所示的 Web 应用程序体系结构。 利用该 mid-tier 中速度应用程序可以获得新级别的可伸缩性、 性能和可用性。 更是具体地说的最小化的数据库资源争用实现可伸缩性的高度。 体系结构从耦合客户端释放状态,各自的特定的服务器节点,并可以通过使用其逻辑使数据更靠近因此改进响应时间,缩短滞后时间启用了性能的改进,这可伸缩性 instilled 更大的灵活性。 通过速度,高可用性是通过冗余,因此减轻影响的数据丢失以及在数据层在节点发生故障的事件上的负载中的峰值而群集实现的。

fig03.gif

图 3 使用速度缓存层

通过显示 interweaving 缓存的层,应用程序可以立即显式利用速度通过各种层和模式。 是例如业务逻辑可能使用直接在缓存备用模式中的速度。 read through-/ 写-隐藏层可能会引入从而使用业务逻辑,以透明方式与速度在业务层下。 在 Web 层可以透明地利用通过速度 ASP.NET 会话状态管理存储提供程序集成的会话的速度。

数据分类

若要完全利用您的应用程序中设置该速度功能,很重要了解通常缓存的数据类型。 这些数据类型可分类为引用数据、 活动数据和资源数据。

引用数据引用是主要是只读的如产品目录或用户的数据的数据。 此数据将写入很少,可能一次每日或周。 但是,引用数据该缩放比例要求需要大量在这些较小的部分的数据的读取请求。

是例如一个的店面中增加的负载的用户浏览目录,产品数据巨大大量存储检索并列表生成操作生成。 Product Catalog 引用数据很少更改,并在客户端是高度可重用,很 conducive 缓存的相当大的压力从数据层卸载通过缓存此数据移近一些应用程序。

上面销售和常购买的一起产品数据可以描述为引用数据 as well。 由于实时要求不为这些报告的必要性,要求应用程序会受益极大地消除分析订单的成本来确定当前的产品与这些分组的每个请求。

活动数据引用部分业务活动或交易记录的数据。 描述为购物车体验在店面中的一部分的数据表示活动数据。 活动数据的它是以独占方式读取和写入,因此通常容易分区。 活动的生命周期后,完成签出本例中,活动数据通常从缓存停用并且保留到底层存储以进行后续处理。

当前,维护购物车状态,示例应用程序需要进行 employ 粘滞路由将对特定的服务器资源的用户会话或保留状态基础数据存储。 通过缓存速度中的此活动数据,可以不再需要粘滞路由,并减轻存储此主要是暂时的购物车数据,直到该活动最终生成订单的基础数据库。

资源数据引用同时读取和 (如作为产品清单写入的数据。 在排序的过程中库存水平可能需要经常监视来强制级别或后填充策略。 但是,为处理订单,此数据需要同时更新为级别中更改的帐户。 经常,处理资源数据时提供性能以及小数位数,coherence 的数据被宽松。 对于是实例在订购过程可能 oversell 其中单独的进程 (如重新排序可能会触发对帐库存冲突的项目。

我开始集成示例应用程序的速度之前,可能有助于快速查看一些核心速度概念。

逻辑层次结构

速度逻辑层次结构包含计算机、 主机、 已命名的缓存,区域,缓存项目 (请参见 图 4 )。 计算机可以运行多个的速度服务每个服务视为缓存主机。 每个缓存主机可以运行多个名为的缓存。 名为缓存这些跨计算机可以跨,和在配置中定义。

fig04.gif

图 4 的速度元素的逻辑层次结构

每个已命名的缓存存储在逻辑组数据,如产品目录。 名为的缓存还设置可用性、 已将其移出,和过期的策略。 显式创建区域物理上共存的数据容器,可能还存在每个命名缓存中。 项目是检索到批量,区域成为如果应用程序始终需要一起处理一组缓存项目。 此外,这些区域通过提供基于标记的搜索和枚举的区域缓存项增强这一可用性。 但是,明确创建的区域是可选的概念。 如果显式不指定任何区域,速度将隐式创建在后台的默认区域。

最后,隐式和显式创建的区域中是该缓存项本身,负责维护项、 对象、 标记、 时间戳、 版本和过期数据的。

分区和本地缓存

速度目前支持两种缓存类型: 分区和本地。 分区的缓存分布的名为缓存的特定主机的缓存项目。 每个重点的名为的缓存可以有效地导致跨速度层中的计算机中维护的已命名的缓存中的项目的备份配置多种速度的高可用性。

本地缓存运行客户端能够加快于从速度检索的数据的访问。 当本地缓存用于协同则速度分区缓存为从速度 Server 环中检索数据时,缓存项存储在运行速度客户端在进程中的对象窗体中。 进一步,与服务器端过期策略,本地缓存也可以将每个配置过期时间的项目。

配置存储

速度配置存储组成缓存策略,以及全局分区映射详细缓存项目的整个群集。 速度使用策略和配置存储中定义的全局分区映射,强制执行由名为缓存定义的策略,并分别运行全局分区管理器。

全局分区管理器是群集的负责传递的其余部分缓存项目横向的速度的一个组件。 与群集创建路由表定义相关数据和速度服务主机之间的通信时,客户端最终会利用此信息。 全局分区管理器运行内有一个速度服务主机。 如果运行全局分区管理器在主机停机速度群集中的另一台主机将假设启动全局分区从全局分区映射的管理器存储在配置存储的责任。 速度,启用要放在网络共享在配置存储或存储在 SQL Server。

Getting Started with 速度

若要获取启动速度,让我们开头速度安装过程,在最初的群集部署和基本的速度客户端应用程序的概述。

在通过缓存服务器上速度安装程序继续,时将显示缓存主机配置屏幕中显示 图 5 .

fig05.gif

图 5 速度缓存主机 Confi guration

缓存主机配置屏幕捕获群集和运行您的速度主机所需的服务设置。 第一次,此屏幕允许您选择是否位于网络共享位置或存储在 SQL Server 配置存储。 此示例,我将使用基于 XML 的文件选项存储在网络共享上的速度配置。

下一步,群集被分配一个名称,以及一个近似的节点大小。 群集大小配置用于通过优化根据您的簇大小的内部数据结构优化速度中的性能。 有可能在以后为您的群集的发展中重置簇大小。

最后,服务配置值部分捕获当前的主机在群集本身运行,以及最大的此速度主机是使用的内存量该端口上,运行的服务端口。

单击测试连接按钮,以验证配置存储的连接。 单击保存并关闭以完成安装。 如果计算机正在运行防火墙,请确保通过为 DistributedCache.exe,速度安装目录中添加异常允许通过速度服务。

要安装其他缓存主机,重复在新的速度计算机上这些安装步骤。 在安装其他主机时,群集与从第一个群集主机的安装期间使用的网络共享上的配置存储将自动检测设置。 例如,我安装了三个节点的群集。

群集部署

一旦安装速度,可以来管理通过 Windows PowerShell。 启动速度命令窗口,运行速度管理快捷方式放在桌面上安装后以管理员身份。 若要能够缓存群集运行开始 CacheCluster 命令。 Get CacheHost 命令将显示整个群集的主机的状态。 Get-CacheStatistics 将显示名为缓存的特定缓存物料统计。 有关通过 Windows PowerShell 的速度管理的详细信息,请参阅附带速度安装文档。

加入到速度群集,XML 策略配置中所示的缓存主机后 图 6 生成 ClusterConfig.xml 文件中的网络共享上。

图 6 速度 XML 策略配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dcache" type="System.Data.Caching.DCacheSection,
      CacheBaseLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
  </configSections>
  <dcache cluster="velsample" size="Small">
    <caches>
      <cache type="partitioned" consistency="strong" name="default">
        <policy>
          <eviction type="lru" />
          <expiration defaultTTL="10" isExpirable="true" />
        </policy>
      </cache>
    </caches>
    <hosts>
      <host clusterPort="22234" hostId="1916351620" size="2048" quorumHost="true"
          name="VELSAMPLE01" cacheHostName="DistributedCacheService"
          cachePort="22233" />
      <host clusterPort="22234" hostId="1249604550" size="2048" quorumHost="false"
          name="VELSAMPLE02" cacheHostName="DistributedCacheService"
          cachePort="22233" />
      <host clusterPort="22234" hostId="1016778186" size="2048" quorumHost="false"
          name="VELSAMPLE03" cacheHostName="DistributedCacheService"
          cachePort="22233" />
    </hosts>
    <advancedProperties>
      <partitionStoreConnectionSettings providerName="System.Data.SqlServerCe.3.5"
          connectionString="\\velsample01\velocity\ConfigStore.sdf" />
    </advancedProperties>
  </dcache>
</configuration>

dcache 配置元素代表 velsample 群集安装过程中创建。 此配置节都包含我在即名为缓存、 主机,和配置存储设置的主机安装过程中设置的该策略配置信息。

在缓存元素中的速度自动创建一个默认的分区、 命名的缓存。 此命名的缓存配置还包含速度使用来强制执行控制此命名缓存中的项目应仍保持内存以及如何速度删除这些项在到期后多长时间的缓存的过期和已将其移出设置策略设置。 在此默认配置 defaultTTL 值指示 10 分钟缓存的项目将保留在内存。 随后,速度将使用最近使用的 (LRU) 算法来退出对象从内存为过期。

在某些情况下,可能需要关闭这些过期和已将其移出设置。 是例如在数据集大小已知相对修复的情况下,如产品目录的示例应用程序中。 在这种情况下已将其移出类型将设置为无 isExpirable 设置将被设置为 False。

下一步,在将主机配置元素速度主机的每个指定命名、 大小和地址信息。 此外,每个主机可以充当一个仲裁主机或导致主机。 在速度的潜在顾客主机负责维护群集的稳定性。 这些潜在顾客承载协作,以防止拆分大脑综合症,群集中的通信丢失导致单独运行一个情况 Sub-clusters。 大多数速度潜在顾客主机必须运行整个群集运行,因此很重要避免与足够潜在顾客主机以确保主机执行不故障同时这些潜在顾客的大多数群集。

所涉及的潜在顾客主机通信是一些额外的开销。 是以根据需要来维护的潜在顾客的仲裁尽可能少的潜在顾客主机运行在群集的好做法。 为从 1 到三个节点的大小的小型群集是可以接受生成的潜在顾客主机小组合的额外开销的数量会相对较低为潜在顾客节点运行所有节点。 对于较大群集,但是,以最大限度地减小开销参与确保群集的稳定性建议使用较小的潜在顾客主机百分比) 是例如 5 导致 10 节点的群集的主机。

对于我示例应用程序,启用所有的三个主机运行导致主机,我可以运行停止 CacheCluster 命令,更新剩余的 quorumHost 值 true,然后运行开始 CacheCluster。

最后,advancedProperties 配置元素用于指定存储提供程序和分区映射的位置。 此处,配置指定分区映射数据库网络位置。 此分区映射数据库使用当前正在运行全局分区管理器的主机。

基本的速度客户端应用程序

若要设置开发环境创建速度应用程序,首先创建一个新的控制台项目。 速度安装目录中添加对以下程序集的引用,请:

  • CacheBaseLibrary.dll
  • CASBase.dll
  • CASMain.dll
  • ClientLibrary.dll

接下来,将一个 app.config 文件添加到具有以下配置控制台项目中:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="dcacheClient" 
      type="System.Data.Caching.DCacheClientSection, CacheBaseLibrary" 
      allowLocation="true" allowDefinition="Everywhere"/>
  </configSections>

  <dcacheClient deployment="routing">
    <localCache isEnabled="false"/>
    <hosts>
      <host name="VELSAMPLE01" cachePort="22233" 
        cacheHostName="DistributedCacheService"/>
    </hosts>
  </dcacheClient>
</configuration>

dcacheClient 部分提供了速度客户端配置。 这些设置指定在的客户端部署类型、 本地缓存的选项以及群集地址信息。

为路由或简单,可以设置部署。 路由的部署允许速度客户端与群集中任何速度主机通讯。 简单的部署指导客户端与需要与目标主机在群集中的其他网络跃点的特定速度主机通信。 路由是推荐的部署,为它降至最低网络开销。 但是,如果存在网络限制允许只与群集中速度主机的一个子集的客户端,简单的部署将是合适。

在本示例在 localCache 元素指定为客户端应用程序禁用本地缓存。 如果 isEnabled 设置为 True 此处,为从该速度群集此控制台客户端应用程序检索缓存项目将保留这些项目在应用程序进程中的对象窗体中,客户端。 为后续旅行到群集将不再是必需,本地缓存可以进一步提高性能。

使用本地缓存启用,一个 ttlValue 可以指定秒对象的数目应保持在本地缓存中有效。 失效的对象的后续请求将导致客户端从群集中检索更新。

值得注意利用本地缓存的客户端将本地检索对象,即使在群集上更新这些项目。 在这种情况下,最好使用本地缓存很少更改的数据。 在后续的版本速度团队面向将允许速度群集发出从而使客户端相应地刷新本地缓存的客户端更新的缓存项目的通知的通知功能。

主机配置为群集中不同的主机指定地址。 此处可以指定多个主机 ; 但,只有一个主机需要为客户端以发现在群集中的其他主机。 客户端配置中的每个主机用于指定名称、 端口和 cacheHostName 设置对应于显示以前群集配置的主机设置。

图 7 显示一个简单对象放速度的程序统一缓存然后从缓存中检索的对象。

图 7 使用速度缓存

using System;
using System.Data.Caching;

namespace VelocityClientConsole {
  class Program {
    static void Main(string[] args) {
      // Create the cache factory
      CacheFactory factory = new CacheFactory();

      // Get the default named cache
      Cache cache = factory.GetCache("default");

      // Add a string to the cache
      cache.Put("MyCacheKey", "Hello World");

      // Get the data from the cache
      string s = (string)cache.Get("MyCacheKey");

      Console.WriteLine(s);

      Console.ReadLine();
    }
  }
}

首先在中,使用语句,引用 System.Data.caching 命名空间内的类型。 在 Main 方法中我会创建一个 CacheFactory 并检索名为标题为默认的缓存。 然后,我使用缓存客户端实例字符串对象放在默认缓存中,检索它。

在 CacheFactory 还提供其他构造函数来创建与客户端配置中不引用的速度群集通信的缓存对象。 在 CacheFactory 将创建适当的具体缓存客户端实现各自部署和通过配置或以编程方式通过 CacheFactory 构造函数指定的本地缓存设置。

运行控制台应用程序通过 Windows PowerShell 之后, 我可以验证的缓存项目是否已创建通过获取缓存和获取 CacheStatistics 命令 (请参见 图 8 )。 获取缓存显示为保存 VELSAMPLE03 主机上的项创建一个隐式的区域。 此外,获取 CacheStatistics 显示大小、 区域,和默认名为缓存的访问信息。

fig06.gif

图 8 查看 Windows PowerShell 中的缓存统计信息

设计缓存

现在,速度已启动并正在运行,让我们开始了设计缓存存储将速度集成 storefront 应用程序。 在此示例,storefront 应用程序利用 Product Catalog 和报表引用数据以及销售订单活动数据的 Northwind 数据库。 此数据模型如 图 9 所示。

fig07.gif

图 9 Storefront 数据模型

应用程序利用传输对象类来表示基础数据存储区。 当前的 storefront 的数据访问层使用 System.Data.SqlClient 填充传输对象。 如果您的应用程序利用更强大的类型映射对象关系映射 (O / RM) 技术,生成这些框架的对象可能以缓存速度只是相同。 只要在数据访问层生成序列化的 CLR 对象,速度将能够缓存这些对象。

指定的缓存

为控制这些类型的数据的属性而异的引用和活动的分类,一个名为缓存到不同 demarcates 这些逻辑单位的组织策略会受益于缓存策略适合每个数据类型的需要。 特别,通过创建单独名为缓存目录、 报表和购物车数据,您可以调整到期、 已将其移出,和可用性策略相应。

因为产品目录可以属于引用数据或共享、 只读的数据,是非常 conducive 缓存。 数据 Moreover,代表引用数据,一个逻辑单元,因此定义单独的名为缓存是一个很好的例子。

要创建此新的名为的缓存,使用新缓存的命令。

New-Cache -CacheName catalog -Eviction none -NotExpirable

与目录缓存数据更改非常少和目录大小是预测,您可以关闭已将其移出以及禁用过期。 但是,如果在其中缓存大小可能会增长时可能产生不可预料的结果的方案很需要利用已将其移出和以防止内存不足的过期。

作为产品引用如顶部的销售产品的报表可能更为频繁目录本身,聚合到名为缓存一个单独的报告的标识符列表有好处,这些产品列表可以分离从基本目录名为缓存策略 fluctuate。 专门,这些产品的引用相关的报表,可以创建单独的名为称为报告与更为严格的过期和已将其移出策略的缓存。

New-Cache -CacheName reports -Eviction LRU -TTL 1440

报告名为缓存创建类产品标识符报表分类信息将过期后一天 (1,440 分钟) 并速度将使用 LRU 算法退出对象缓存中。 使用单独的名为的缓存,聚合的产品标识符列表将允许在报表的相关数据和产品目录数据因而异独立不同到期并已将其移出的策略。 在这种情况下前销售, 产品可以是从目录缓存中检索使用从名为缓存的报告的产品标识符列表。 而在产品目录一直缓存,可能后台进程更新常规或触发时间间隔,将每天,过期销售顶端的报表列表对象。

为与会话相关的数据是传统上读取而编写,它可以被归类为活动数据。 因为购物车数据是关键的订单完成,也是强要求高可用性此数据。 原始应用程序中, 缓解的购物车的数据丢失此状态将已被保留通过基础数据存储的相应订单完成之前。 在一个速度启用店面为通过在购物的车体验的用户进行基于车数据的活动可以被以独占方式读取并写入速度群集。

通过新建会话,名为缓存,您可以调整周围的活动相关数据属性的策略。 特别,对于以前在默认 InProc ASP.NET 会话中缓存此数据的应用程序状态、 更灵活缩放启用通过速度 SessionStoreProvider 集成。 粘滞路由不再需要根据到状态的特定服务器的两个用户请求。 进一步,从而名为缓存会话上高可用性不到数据库的保持数据减轻数据丢失。 速度阻止群集通过行会冗余地存储车数据。

下面此新缓存命令将创建名为缓存会话。

New-Cache -CacheName session -Secondaries 1 -TTL 1440

–secondaries 开关指定存储在此命名缓存中每个项目的备份的数。 在此示例,速度将避免 1 其他的备份副本存储在名为缓存会话中每个购物车的群集。

组织缓存

应用程序需要能够解决类别和产品都独立,以及在类别和产品列表。 有多种方法,您可以采用组织名为缓存,包括基于区域的组织和基于列表的组织在目录中的这些对象。 这两种方法所关注的一定程度的对象分配整个群集。 但是,根据应用程序的需要,另一个组织方法可能更适合。 例如,您可以缓存对象图由参数,或者您可以使用页缓存。

可以使用速度区域组织在产品目录。 区域是有利示例方案中,因为它们允许地址类别中的特定产品一起或独立应用程序。 对于是实例应用程序可能需要提供可能需要在其他情况下显示仅产品详细信息页时,在某些情况下,列表的整个产品类别。 组织目录缓存使用的产品类别关联的区域将产生 图 10 所示在层次结构。

fig10.gif

图 10 区域基于组织

在此缓存存储模式本身在 Category 对象将存储独立而产品对象将存储在相对于类别成员身份的区域。 为该目录的基于区域的方法的另一个潜在的好处包括 co-location: 为某个区域中的所有对象都保证驻留在同一速度主机计算机上,将批量检索在整个产品类别区域。 一个基于列表的方法需要多个缓存请求。 区域还允许根据要缓存项目的辅助索引的标记的项目检索。

虽然一个基于区域的方法提供批量检索优化,产品,和标记基于检索,单独的访问中的好处的项目 co-location 未能还提供一个瓶颈。 如果客户端应用程序比其他更积极地消耗特定类别区域,此区域作用点将防止吞吐量通过群集缩放通过产品的数据提供固有的好处。

为产品类别组织使用基于列表的方法将在因此完全实现可伸缩性优点通过的数据可能在该群集升级甚至分发项目。 在一个基于区域的方法可能未能开发产品的实际共存组合中的活动的作用点,一个基于列表的方法将允许您将整个群集列出任何特定产品类别的负载。 此组织的方法需要存储的 Category 对象、 产品的对象和标识独立存储的产品对象的类别列表对象。 此基于列表的方法缓存组织如 图 11 所示。

fig11.gif

图 11 基于列表的组织

尽管组织目录了基于列表的方法可在整个群集均匀地分布目录活动的负载,来解决所有的产品类别一起,多个缓存请求是需要。 有关此主题,批量读 / 写将是速度团队设定为将来的版本一功能。

组织报告

您可以使用一个类似的基于列表的组织报告名为缓存。 decoupling 从目录名为缓存这些引用报表允许策略控制改变独立的报告和目录数据的。 有效地,这使您可以调整到期并已将其移出策略根据为各自的数据类型。 相当静态目录引用数据禁用过期和已将其移出,更加动态的报告数据实施更为严格的过期和已将其移出策略时。 组织,报告名为缓存中的产品密钥列表对象将标识类似于用于产品的类别列表,但在名为缓存使用方法在目录缓存中的产品对象。

若要检索基于这些聚合的引用报表的产品,基于列表的方法使用报告和名为缓存目录。

组织会话

只读 / 写的活动基于方案,接近缓存组织通过存储对象层次结构可能是最佳的选择。 是例如在名为缓存会话,您可以组织包含有关特定用户所选的每个产品的信息的购物车对象: 产品、 价格和数量。

而目录组织通过在缓存之间分布项目提升高度可伸缩性,购物车缓存项不为高度的可重用跨请求。 可以通过缓存单个项下的每个用户的购物车而不是作为顶级缓存项购物车项分布命名缓存提高性能。 更确切地说,如 storefront 应用程序生成到名为缓存,会话的请求,可以通过一个请求的批量检索每个购物车。 此外,使用高可用性创建名为缓存会话后, 速度将通过维护群集的每个购物车的副本保护会话数据。 该会话组织方法如 图 12 所示。

fig12.gif

图 12 会话缓存组织

应用程序可能会维护直接通过速度的 API 的基于活动的项,并 ASP.NET 应用程序可能会利用与会话存储提供程序框架来以透明方式与通过 ASP.NET 会话 API 的缓存层中实现速度的速度的集成。

编程缓存层

当前的体系结构层 demarcated 与用户界面 (Web),业务逻辑层 (BLL) 和数据访问层 (DAL)。 为当前应用程序主要处理由数据层的数据传输对象,缓存这些相应的形状中的数据有助于提供他们了解的表示形式的应用程序层。 storefront 示例引入了缓存层之间的商务和数据层。 通过 interweaving 缓存逻辑业务层下的,统一依赖业务逻辑的图层受益于自身业务逻辑透明地使用在缓存层时生成调用该缓存的逻辑之前验证业务规则。 此外,在 Web 层利用速度 ASP.NET 会话存储提供程序集成。

若要查看操作中的这将,让我们遍历使用产品类别列表视图开始在缓存层。 若要开始,列表查看调用业务逻辑层的类别验证请求,然后通过 VelocityCatalogCache 上调用 GetProductsByCategory 方法中使用缓存层 (请参见 图 13 )。 此协调速度缓存和数据存储区以透明业务逻辑的方式之间的封送处理数据。

图 13 GetProductsCatalog

public IList<Product> GetProductsByCategory(int id) {
  IList<Product> products = null;

  IList<int> productIDs = (IList<int>)_catalogCache.Get("ProductCategoryList-" + id);

  if (productIDs != null) {
    products = new List<Product>(productIDs.Count);

    foreach (int productID in productIDs) {
      products.Add((Product)_catalogCache.Get("Product-" + productID));
    }
  }
  else {
    products = DataLayer.CatalogProvider.GetProductsByCategory(id);

    if (products != null && products.Count > 0) {
      productIDs = new List<int>(products.Count);
      foreach (Product p in products) {
        productIDs.Add(p.ProductID);
        _catalogCache.Put("Product-" + p.ProductID, p);
      }

      _catalogCache.Put("ProductCategoryList-" + id, productIDs);
    }
  }

  return products;
}

在此产品类别列表在缓存层将充当 read-through 提供程序来简化业务层。 这是与缓存使用速度的逻辑的编程的只有一个分层方法。 是例如为在企业级别的门粒度控件,利用缓存备用模式直接在业务层中的速度会提供以及一个可行方法。 在将来版本,速度团队面向 read through-/ 写-隐藏支持其中可能回调注册进行协调缓存和基础的存储区之间的封送处理数据从而使客户端可以利用通过速度缓存 API 的此问题而不是包装图层。

在 GetProductsByCategory 缓存层方法实现很重要介绍为并发操作方式。 在此方法,是当前正在不使用任何并发模型。 该目录是很少更改的主要 read-only 引用数据,影响为并发操作不会太严重。 但是,就可能为多个线程,或执行相同的更新逐个,如果它们所到达的客户端同时缓存未命中数。 或者,为并发是关键的方案,例如缓存各种类型的资源数据时,速度支持两种乐观和悲观并发模型。

与 ASP.NET 会话状态集成

速度能够以透明方式利用缓存群集通过 ASP.NET SessionStoreProvider 框架。 此功能允许 Web 应用程序通过 HttpContext.session 属性访问指定的名称缓存中的项。

这一集成 decoupling 从特定服务器的缓存状态的可伸缩性提供大的好处。 情况会话,或活动相关数据利用速度,更加灵活的扩展启用为体系结构释放从客户端离合器到各个状态的特定的服务器节点。

方案要求如在购物的活动数据之类的高可用性的速度使您能够轻松地创建名为缓存,在会话过程中所示的冗余避免群集从而提供了可用性更靠近使用逻辑。

若要在 ASP.NET 中的速度 SessionStoreProvider 集成下列配置添加到 storefront ASP.NET 应用程序中 Web.config 文件中。 此配置将与在以前创建的会话,名为缓存关联 storefront 的 ASP.NET 会话状态。

<system.web>
  <sessionState mode="Custom" customProvider="SessionStoreProvider">
    <providers>
      <add name="SessionStoreProvider" 
        type="System.Data.Caching.SessionStoreProvider, ClientLibrary" 
        cacheName="session" />
    </providers>
  </sessionState>
</system.web>

然后,访问名为通过 ASP.NET 的缓存该会话,在店面维护用户购物车活动数据在 Product.aspx 页中显示为 图 14 .

图 14 通过 ASP.NET 访问缓存

protected void AddToCartButton_Click(object sender, EventArgs e) {
  ShoppingCart cart = (ShoppingCart)Session["ShoppingCart"];

  if (cart == null) {
    cart = new ShoppingCart();
    Session["ShoppingCart"] = cart;
  }

  int productID = Convert.ToInt32(Request.Params["id"]);

  ShoppingCartItem item = cart[productID];
  if (item != null) {
    item.Quantity++;
  }
  else {
    Product p = ServiceLayer.CatalogService.GetProduct(productID);

    cart[productID] = new ShoppingCartItem() {
      ProductID = productID,
      Quantity = 1,
      UnitPrice = p.UnitPrice
    };
  }

  Response.Redirect("~/Cart.aspx");
}

订单完成,活动面向购物车可以从中删除该会话名为缓存而且传播到基础数据存储区,如下所示从 purchase.aspx 页。

protected void CheckoutButton_Click(object sender, EventArgs e) {
  ShoppingCart cart = (ShoppingCart)Session["ShoppingCart"];

  ServiceLayer.OrderService.ProcessOrder(cart,
    NameTextBox.Text, AddressTextBox.Text, CityTextBox.Text,
    RegionTextBox.Text, PostalCodeTextBox.Text, CountryTextBox.Text);

  Session["ShoppingCart"] = null;

  Response.Redirect("~/Congrats.aspx");
}

通过在 ASP.NET 会话 API 应用程序现在无缝地利用意识到活动面向数据移近一些在使用的逻辑不再需要编写技术 (如粘滞路由和保护通过高可用性支持以前启用通过名为缓存会话的购物车活动数据的速度。

将转发

速度限于分布式体系结构以及基本的硬件趋势,来实现此 pervasiveness 的数据移近一些使用应用程序演变。本文仅提供的功能和推动速度的 rationales 第一个一下。

示例 storefront 应用程序现在利用缓存引用目录和报表数据以及使用策略适合每个数据类型的购物车活动数据的速度。而缩放以前通过复制目录数据操作,在每个页加载时禁止的现在情况最小化基础数据存储区上的负载和意识到我们编录引用数据靠近使用它,逻辑高度可伸缩性和性能会启用。响应时间也得到了改善,并您获取更灵活缩放释放基础结构从离合器请求基于状态的资源。不到基础数据存储区根据需要之前,通过在速度的高可用性支持保护关键的订单完成的数据。

如果您希望在根本原因的其他深入对于分布式,内存在缓存,概述整个速度功能集和信息下载,看到白皮书"Microsoft Project 代码命名速度"和速度开发人员中心.

Aaron Dunnington 是在 Microsoft 的数据可编程性团队在项目经理。在可以访问他https://blogs.msdn.com/Velocity.