云服务基础 – 缓存基础知识

本文章由 Azure CAT 团队的 Rama Ramani 撰写。

云服务基础”应用程序也称作“CSFundamentals”,展示如何构建数据库支持的 Azure 服务。在上一篇博客文章 DAL – RDBMS 的分区中,我们讨论了一种在数据库层中实施横向可伸缩性的技术,即分区。在本文章中,我们将讨论缓存的重要性、要考虑的因素,以及如何在 Windows Azure 中进行配置和实施。

分布式缓存架构在横向扩展的基础上构建,其中若干台计算机(物理机或虚拟机)将作为具有分摊工作负荷的固有分区能力的群集环的一部分。缓存为 <key, value> 查找范例, 它们的值为序列化的对象,这些对象可能是一个更为复杂的数据存储操作的结果集,如跨数据库中的多个表执行 JOIN 操作。因此,使用缓存, 就不用针对数据存储多次执行操作,而是针对缓存进行快速键查找。

了解什么内容适合被缓存

首先,您需要分析工作负荷并确定合适的缓存对象。数据缓存时,缓存和“数据源”之间的“过期”容错应在应用程序的可接受范围内。总体而言,缓存可用作参考(对于所有用户均为只读数据),如用户配置文件、用户会话(单个用户进行读写),或在某些情况下用作资源数据(使用锁定 API 让所有用户均可读写)。在某些情况下,特定的数据集可能并不适合进行缓存 - 例如,如果某个特定的数据集正在迅速发生变化、应用程序无法容许过期,或者您需要执行事务。

容量规划

下一步是估计应用程序的缓存需求。这需要查看一系列指标(刚好大于缓存大小),以制定最初的大小指南。

  • 缓存大小: 可以使用对象的平均大小和对象的数量粗略估算所需的内存量。
  • 访问模式和吞吐量要求: 读写组合显示了新对象的创建、现有对象的重新写入或对象的读取。
  • 策略设置: 生存期 (TTL)、高可用性 (HA)、到期类型和逐出策略的设置。
  • 物理资源: 除了内存,网络带宽和 CPU 利用率也非常重要。网络宽带可根据特定的输入进行估算,但大多数情况下,应对网络宽带进行监控,然后将其用作重新计算的基础。

可从 https://msdn.microsoft.com/en-us/library/hh914129 获取更详细的容量规划电子表格

Azure 缓存拓扑

下表列出了 Azure 上提供的 PAAS 选项集,并提供了简要说明

类型

说明

In-Role dedicated

在专用拓扑中,可以定义缓存专用的 worker role。这意味着 worker role 的所有可用内存都可用于缓存和运行开销。

https://msdn.microsoft.com/en-us/library/windowsazure/hh914140.aspx

In-Role co-located

在co-located拓扑中,您可以使用应用程序角色上一定百分比的可用内存进行缓存。例如,您可以在每个 Web 角色实例上分配 20% 的物理内存进行缓存。

https://msdn.microsoft.com/en-us/library/windowsazure/hh914128.aspx

Windows Azure 缓存服务

Windows Azure 缓存服务当前(2013 年 9 月)处于预览状态。下面是一些有用的链接

https://blogs.msdn.com/b/azchina/archive/2013/09/03/announcing-new-windows-azure-cache-preview.aspx

https://msdn.microsoft.com/en-us/library/windowsazure/dn386094.aspx

Windows Azure 共享缓存

多租户缓存(带有限制和配额)最晚将于 2014 年 9 月停用。可从 https://www.windowsazure.com/en-us/pricing/details/cache/ 获取更多详细信息。建议客户使用上面的一个选项来利用缓存。

实施详细信息

CSFundamentals 应用程序利用In-Role dedicated的 Azure 缓存来简化读取经常访问的信息 - 如用户配置文件信息、用户注释。In-Role dedicated部署为首选,因为它分离了缓存相关的工作负荷。然后可以通过性能计数器(CPU 使用率、网络带宽、内存等)和相应伸缩的缓存角色实例进行监控。

注意:实施 CSFundamentals 期间,新的 Windows Azure 缓存服务不可用。除 CSFundamentals 应用程序之外,如果需要使用缓存数据,这将是首选。

ICacheFactory 接口定义了 GetCache 方法签名。ICacheClient 接口定义了 GET<T> 和 PUT<T> 方法签名。

public interface ICacheClient

 

AzureCacheClient 实现了此接口,并引用通过 Windows Azure Caching NuGet 程序包进行添加的 Windows Azure 缓存客户端程序集。

 

创建DataCacheFactory 对象会建立与缓存角色实例的昂贵连接,因此将其定义为静态连接并使用 Lazy<T> 缓慢进行实例化。

app.config 已启用自动发现并且标识符用于正确指向缓存 worker role:

      <autoDiscover isEnabled="true" identifier="CSFundamentalsCaching.WorkerRole" />

注意:要修改解决方案以使用新的 Windows Azure 缓存服务,请将标识符属性替换为在 Windows Azure 门户中创建的缓存服务端点。此外,API 密钥(可通过门户上的 Manage Keys 选项进行检索)必须复制到 app.config 中的“messageSecurity authorizationInfo”字段。

实施 GET<T> 和 PUT<T> 方法使用了 BinarySerializer 类,BinarySerializer 类又利用 Protobuf 类进行序列化和反序列化。protobuf-netProtocol Buffers的 .NET 实施,让您可以高效、轻松地对 .NET 对象进行序列化。通过 protobuf-net NuGet 包进行添加。

序列化为传入的参数 T 生成 byte[] 数组,然后将其存储在 Windows Azure 缓存群集中。为了返回特定密钥请求的对象,GET 方法使用反序列化方法。

本博客概述了缓存基础知识。有关详细信息,请参阅 CloudServiceFundamentals Visual Studio 解决方案中的 ICacheClient.cs、AzureCacheFactory.cs、AzureCacheClient.cs 和 BinarySerializer.cs。

本文翻译自:

https://blogs.msdn.com/b/windowsazure/archive/2013/10/03/cloud-service-fundamentals-caching-basics.aspx