Azure 角色中缓存的 Memcache 包装程序

重要

Microsoft 建议所有新开发使用 Azure Redis 缓存。 有关选择 Azure 缓存产品/服务的当前文档和指南,请参阅 哪种 Azure 缓存产品/服务适合我?

Memcache 概述

Memcache 是一种分布式内存中缓存解决方案,用于通过减轻数据库压力来帮助加快大型 Web 应用程序的运行速度。 Memcache 由许多大型 Internet 网站使用,并已通过创新方式与其他技术合并。

Azure 支持 Memcache 协议,允许客户将现有 Memcache 实现轻松迁移到 Azure。 如果应用程序已使用 Memcache,则没有必要使用新代码替换此代码。

运行带有 Memcache 的 Azure Caching 是一个相对较好的选择,例如,好过仅在辅助角色中运行 Memcache 本身。 这是因为 Azure Caching提供增值功能,例如正常关闭、高可用性、客户端填充码) 上的本地缓存 (、客户端填充码) 通知 (、数据一致性、高可用性 (HA) ,以及简单的纵向扩展和缩减,对客户端而言是透明的,例如几个。 例如,带有 Memcache 的 Azure Caching 中的服务器哈希方案和分区管理可帮助进行负载平衡和保持数据一致性。

Memcache 协议支持

Azure Caching 支持 Memcache 线路协议。 有两种协议版本:二进制版本和文本版本

Azure Caching 除了支持其自身的线路协议外还支持此协议。 Memcache 客户端应与 Azure 兼容。 Azure Caching 支持差不多所有其他 Memcache 实现所支持的 API。

因此,如果用户将 Memcache 应用程序引入 Azure,请将该应用程序指向 Azure 的 Memcache 实现,它将继续按原样运行,而不需要执行额外的应用程序修改。

Memcache 支持两种不同的开发人员体验:使用“服务器网关”,并使用“客户端填充码”。

Memcache 服务器网关

从实施、部署和概念理解的角度来看,服务器网关是简单的,但它也附带有重要的注意事项,这些注意事项将在下面进一步讨论。

使用服务器网关时,服务器缓存群集将侦听 Memcache 套接字。 换句话说,它将打开一个套接字并侦听 Memcache 协议上的数据包。 没有转换层(下文讨论)。

若要启用此功能,请在缓存群集中打开一个附加内部终结点,为它起一个名字,并将其设为 Memcache 端口。 所有绑定到该端口的通信均将通过 Memcache 协议接收。

但是,与使用客户端填充程序方案相比,服务器网关在高性能敏感方案中会降低性能。 这是因为 Memcache 实现在实现哈希算法的方式上与 Azure Caching 不同。 Memcache 实现会将哈希方案委托给缓存客户端。 在 Azure 中,缓存服务器将生成哈希值。 Azure Caching 行为是让缓存服务器指定哈希行为。 这使得服务器可以实现负载平衡、通胀、通缩并确保没有数据丢失,等等。

当 Azure 缓存某个项目时,将基于该项目的键值生成一个哈希。 Azure 使用哈希值来确定缓存群集中的哪个服务器将包含缓存的项目。 因此,Azure 服务器网关需要对键重新执行哈希运算,并将项目路由到缓存群集中的目标服务器。 此操作涉及额外的网络跃点,因此会降低性能。

Memcache 客户端填充程序

Memcache 客户端填充程序安装在用于访问缓存的客户端上。 该客户端通常是拥有应用程序本身的 Azure 角色。 客户端填充程序支持本地缓存。

该填充程序是转换层。 它将转换 Memcache 客户端对 Azure Caching API 的调用。 填充程序包含两个部分 - 一个 Memcache 协议处理程序和一个 Azure Caching 客户端。 填充程序(转换层)安装在客户端本身上,不管对 Azure Caching API 的 Get 和 Put 调用来自何处。

当 Memcache 客户端指向作为 Memcache 服务器的 localhost 时,Put 操作最初将由该填充程序的本地实例处理,而不是由 Azure 中的缓存服务器处理。 然后,该填充程序将确定缓存群集中的正确的目标服务器,并将 Put 操作重定向到 Azure。

这将消除服务器网关方案中存在的额外网络跃点。 缺点是,你必须获取该填充程序并将其置于你的应用程序中。

使用服务器网关与客户端填充程序

缓存有两个拓扑:共存缓存和专用缓存角色。

如果要将缓存群集部署到专用缓存辅助角色中,请使用缓存客户端中的 Memcache 填充程序。 这会为你提供更好的性能,并可避免自动发现代码。

如果使用的是共存缓存并且缓存客户端在同一角色中托管,请使用 Memcache 服务器网关。 使用客户端填充程序涉及一个附加的处理和重定向层,这在访问同一角色中的缓存时是不必要的。 添加重定向会增加不必要的开销。

使用服务器网关或客户端填充程序没有对应的编程模型。 唯一要做的操作是配置设置更改。 客户端填充程序还需要进行安装。

使用服务器网关或客户端填充程序更像是一个部署操作,而不像是一个编程模型操作。 作为编程人员(仍要调用相同 Get 或 Put API 的人员),只有应用程序的配置略有不同。 它现在将指向服务器网关或客户端填充程序,而不是指向原始缓存服务器。

结果就是,服务器网关和客户端填充程序均不了解所使用的 Memcache 客户端库,因为标准的 Memcache 实现使用同一协议。 缓存服务器与遵循标准 Memcache 协议的数据包有关,而与 Memcache 客户端实现本身无关。

如何为 Azure 应用程序部署服务器网关

  1. 对于将托管缓存服务器的角色,请转到角色属性的“Caching”选项卡

  2. 选中复选框“启用Caching”。  这将在 csdef、importModule 元素和其他 csdef/cscfg 设置中添加输入终结点。 下一个部署体验是在“终结点”选项卡上手动添加名为“memcache_default”的输入终结点。

  3. 现在必须将客户端配置为指向此群集。 如果将服务器网关与并置缓存结合使用,或者将客户端填充码与专用缓存配合使用,只需将应用指向“localhost_thisrolename”即可 - 无需自动发现

如何为 Azure 应用程序部署客户端填充程序

  1. 在具有 Memcache 客户端的角色上,右键单击角色名称并选择“添加库程序包引用”以启动 NuGet 窗口

  2. 搜索“Azure Caching Memcache 填充程序”。 安装此 NuGet 程序包

  3. 此程序包将创建启动任务,为 memcache_default 添加内部终结点并将其映射到 11211,然后向 App.config 和 web.config 中添加相应的 dataCacheClients 节。可以在内部终结点选项卡中更改此配置。

  4. 在 App.config 或 Web.config 的 autoDiscovery 元素中提供角色名称

  5. 现在必须将客户端配置为“指向”此填充程序。 编辑 Memcache 客户端配置并将服务器设置为“localhost”。 此外,还必须设置正确的端口号。