云服务基础 – 缓存基础知识
本文章由 Azure CAT 团队的 Rama Ramani 撰写。
“云服务基础”应用程序也称作“CSFundamentals”,展示如何构建数据库支持的 Azure 服务。在上一篇博客文章 DAL – RDBMS 的分区中,我们讨论了一种在数据库层中实施横向可伸缩性的技术,即分区。在本文章中,我们将讨论缓存的重要性、要考虑的因素,以及如何在 Windows Azure 中进行配置和实施。
分布式缓存架构在横向扩展的基础上构建,其中若干台计算机(物理机或虚拟机)将作为具有分摊工作负荷的固有分区能力的群集环的一部分。缓存为 <key, value> 查找范例, 它们的值为序列化的对象,这些对象可能是一个更为复杂的数据存储操作的结果集,如跨数据库中的多个表执行 JOIN 操作。因此,使用缓存, 就不用针对数据存储多次执行操作,而是针对缓存进行快速键查找。
了解什么内容适合被缓存
首先,您需要分析工作负荷并确定合适的缓存对象。数据缓存时,缓存和“数据源”之间的“过期”容错应在应用程序的可接受范围内。总体而言,缓存可用作参考(对于所有用户均为只读数据),如用户配置文件、用户会话(单个用户进行读写),或在某些情况下用作资源数据(使用锁定 API 让所有用户均可读写)。在某些情况下,特定的数据集可能并不适合进行缓存 - 例如,如果某个特定的数据集正在迅速发生变化、应用程序无法容许过期,或者您需要执行事物。
容量规划
下一步是估计应用程序的缓存需求。这需要查看一系列指标(刚好大于缓存大小),以制定最初的大小指南。
- 缓存大小: 可以使用对象的平均大小和对象的数量粗略估算所需的内存量。
- 访问模式和吞吐量要求: 读写组合显示了新对象的创建、现有对象的重新写入或对象的读取。
- 策略设置: 生存期 (TTL)、高可用性 (HA)、到期类型和逐出策略的设置。
- 物理资源:除了内存,网络带宽和 CPU 利用率也非常重要。网络宽带可根据特定的输入进行估算,但大多数情况下,应对网络宽带进行监控,然后将其用作重新计算的基础。
可从 http://msdn.microsoft.com/en-us/library/hh914129 获取更详细的容量规划电子表格
Azure 缓存拓扑
下表列出了 Azure 上提供的 PAAS 选项集,并提供了简要说明
类型 |
说明 |
In-Role dedicated |
在专用拓扑中,可以定义缓存专用的 worker role。这意味着 worker role 的所有可用内存都可用于缓存和运行开销。 http://msdn.microsoft.com/en-us/library/windowsazure/hh914140.aspx |
In-Role co-located |
在co-located拓扑中,您可以使用应用程序角色上一定百分比的可用内存进行缓存。例如,您可以在每个 Web 角色实例上分配 20% 的物理内存进行缓存。 http://msdn.microsoft.com/en-us/library/windowsazure/hh914128.aspx |
Windows Azure 缓存服务 |
Windows Azure 缓存服务当前(2013 年 9 月)处于预览状态。下面是一些有用的链接 http://blogs.msdn.com/b/azchina/archive/2013/09/03/announcing-new-windows-azure-cache-preview.aspx http://msdn.microsoft.com/en-us/library/windowsazure/dn386094.aspx |
Windows Azure 共享缓存 |
多租户缓存(带有限制和配额)最晚将于 2014 年 9 月停用。可从 http://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-net 是Protocol Buffers的 .NET 实施,让您可以高效、轻松地对 .NET 对象进行序列化。通过 protobuf-net NuGet 包进行添加。
序列化为传入的参数 T 生成 byte[] 数组,然后将其存储在 Windows Azure 缓存群集中。为了返回特定密钥请求的对象,GET 方法使用反序列化方法。
本博客概述了缓存基础知识。有关详细信息,请参阅 CloudServiceFundamentals Visual Studio 解决方案中的 ICacheClient.cs、AzureCacheFactory.cs、AzureCacheClient.cs 和 BinarySerializer.cs。
本文翻译自: