文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

你可以通过使用Apache Ignite分布式缓存用来提高ASP.NET Web应用程序的速度。继续阅读,了解更多信息。

ASP.NET Web Farm with Apache Ignite caching

基本原理

ASP.NET 应用程序的性能提升可以通过多种方式,包括:

  • 使用 Output Cache 缓存已渲染过的页面。
  • 通过向外扩展方式设置一个Web应用,使多个服务器处理请求。

但如果我们想结合使用那个这些方法呢? 在Web应用中使用默认的输出缓存机制意味着服务器之间的缓存内容是分离的。所以如果负载均衡器发送一个主页请求给服务器1,同时另一个主页请求到达了服务器2,那么服务器1的缓存对服务器2是没用的。如果有N台服务器,输出缓存只对第N次有效。

第 1 段(可获 1.45 积分)

分布式缓存解决了这个问题,同时还提供其他功能::

  • 所有已缓存的数据在多台服务器之间是共享的。 无论负载均衡器选择的是哪台服务器,如果有相应的记录,它都会得到缓存内容。
  • 工作线程回收时数据不会丢失.
  • 所有服务器的内存都已组合,用以给予更多数据的缓存。

让我们看看如何使用Apache Ignite安装ASP.NET输出缓存。

Test Project

我们将从微软网站下载一个名为 Contoso University 的示例项目,它是一个基于MVC5的多页面应用程序。

第 2 段(可获 1.51 积分)

设置输出缓存

启用输出缓存非常简单,只需将controller的action对象加入[OutputCache] 属性即可:

  • 导航到 HomeController 类.
  • 为首页启用5秒过期缓存:
[OutputCache(Duration = 5, Location = OutputCacheLocation.Server)]
public ActionResult Index()
{
    return View();
}

默认情况缓存同时位于服务器和客户端, 因此我们将不能在本地测试项目:服务端会返回304错误, 并且服务端缓存不会被执行. 这就是为什么要用到OutputCacheLocation.Server 这个值.

第 3 段(可获 0.85 积分)

要验证缓存是否成功,在首页标题添加DateTime输出项:

<h1>Contoso University @DateTime.Now.TimeOfDay</h1>

现在如果你重复的刷新页面,显示的时间将会每隔5秒改变一次.

因为我们已经配置了默认的输出缓存机制.如果你将应用程序发布到两台服务器,将两台服务器靠在一起比较首页,你会发现显示的时间永远不相同,因为每台服务器各自维护了一个单独的缓存。

配置Apache Ignite.NET 输出缓存提供程序

  • 通过Nuget安装 Ignite ASP.NET 提供程序: Install-Package Apache.Ignite.AspNet
  • 在web.config的<configSection>中加入Ignite 配置节点:
第 4 段(可获 1.2 积分)
<section name="igniteConfiguration" type="Apache.Ignite.Core.IgniteConfigurationSection, Apache.Ignite.Core" />
  • 配置默认的 Ignite 实例:
<igniteConfiguration />
  • 添加如下内容到 system.web 来配置默认的缓存实现:
<caching>
    <outputCache defaultProvider="apacheIgnite">
        <providers>
            <add name="apacheIgnite" type="Apache.Ignite.AspNet.IgniteOutputCacheProvider, Apache.Ignite.AspNet"
                 igniteConfigurationSectionName="igniteConfiguration" />
        </providers>
    </outputCache>
</caching>
第 5 段(可获 0.19 积分)

就是这样!无需改变代码,我们就已经使用分布式缓存替换了生产中的常见输出缓存.在局域网的两台或多台服务器中运行这些项目,验证是否多台服务器都返回相同的缓存数据和相同的时间戳.

我们已经配置好了Ignite在ASP.NET程序运行时在相同的进程中运行并保留数据。在生产环境中, 你可能想在服务器模式中使用独立的Ignite节点,并且将ASP.NET缓存提供给客户端模式. 关于这些内容,详见 Clients and Servers.

性能

使用我电脑上的 Fiddler 软件进行了一个快速的测试,发现首页的缓存的页面载入时间为1ms, 没缓存的页面用了4ms. 基本上对于一个空白页来说提升四倍的速度是很不错的了. 而对于实际运行中的做一些逻辑任务的页面将会提升更多.

第 6 段(可获 1.78 积分)

默认情况下,Ignite 缓存使用 CacheMode.Partitioned模式. 这个模式将服务器之间的数据隔开,并有效的组合他们的内存用来存储数据。然而,这个模式在缓存的数据在别的服务器上时会导致网络错误。

而使用 CacheMode.Replicated 模式让每个缓存节点都具有缓存对象的镜像内容。这个模式需要使用更多的内存,不过会提供更高的读取性能。

第 7 段(可获 0.66 积分)

文章评论