# Microsoft Azure - Azure、Web API 和 Redis 如何有助于加快数据交付
通过 [Johnny Webb](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Johnny+Webb), ,[Sean Iannuzzi](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Sean+Iannuzzi) |2015 年 12 月
在今天的 worldof 实时营销、 死亡的旋转圆,经常伴随等待加载或搜索查询以填充的页面真正意味着销售的死亡。随着越来越多的数据记录的创建、 存储和分析,生成的丰富,实时数据洞察力增长不断更具挑战性。问题就是如何选择适当的技术工具和体系结构,以便最好地筛选数以百万计的数据记录并交付更好的客户体验的即时结果。
本文将探讨我们在其中帮助实现 Redis 和 Web API 的客户端最新的用例。我们将讨论我们实现的方法,我们遇到的难题和如何我们最终实现的性能要求。
## 业务挑战
几个月前,财富 100 强多样的保险和金融服务组织接近 Harte 衷心感谢,一家全球性市场营销公司,使用的新计划。该公司希望在线的保险报价过程提供更好、 更丰富的客户体验。若要执行此操作,它需要以启用对客户的策略数据的快速、 积极主动的访问。
目标是以使客户能够查看和选择一个或多个保险策略是通过 Internet 自助服务或代理面向应用程序。从根本上讲,这将导致更高版本的业务价值、 提高了客户满意度、 更快的报价单绑定速率和改进的代理授权过程。为了使这成为现实,在报价过程中进行处理时所需的客户的存储的详细信息和数据匹配,并且主动,提供几乎即时的方式。
客户端的数据库包含超过 50 万条记录,这意味着与任何传统数据库这种性质的请求通常会需要多长时间加载。我们已任务提供支持此较大的数据源上执行查询并将结果传送到几毫秒的时间的使用者的 Web 服务。
对于此任务中,我们计算的 Redis 和 Web API 的实现。总体的度量值因素是:
* 事务请求
* 对象的请求
* 每秒的响应
* 数据的总带宽
* 总吞吐量的站点
## 实现过程: 我们是如何做到了
构建 Web 服务来公开数据,要求提供特定功能的组件的多个层。随着 Web 服务的需求的发展,支持这些层的基础结构必须修改并快速缩放。和可伸缩性是必需的但同样重要的是可用性,并必须始终被视为为了让使用者满意。此外,还必须监视和使用特定的身份验证协议,以确保受保护的数据并将数据与最大性能安全地传递包装公开的终结点。为了满足这些要求对于我们的解决方案,我们就利用了 Microsoft Azure。在 Azure 中,我们部署了资源包括虚拟机、 Web 应用程序、 虚拟网络、 资源组的组合和可用性集来构建一个完备、 高质量的解决方案。
## 数据层
由于我们的解决方案的大部分都生成使用 Microsoft 堆栈,因此我们在大多数情况下利用 Microsoft SQL Server 一点非常有意义。但是,此解决方案的 SLA 要求在具有超过 50 万条记录的数据集上指定的服务响应时间是小于 1 秒,每个请求,以每小时,大约 6000 请求的速率。类似于 SQL Server 的传统数据库将数据存储到磁盘和 IOPS 的瓶颈,因为我们无法保证每个查询将通过这一要求。若要进一步复杂化了,我们已公开所需的数据子集属于传统的数据库包含千吉字节的不相关的数据。为此,我们开始评估可能快速支持大型数据集的解决方案。即,当我们发现 Redis。
Redis 是内存中数据结构存储,支持多个数据类型。关键的服务器要求包括 Linux 分发,足够的 RAM 来封装你的数据和实现数据持久性足够的磁盘空间。Redis 也可配置为群集中,但这是更适合于具有千吉字节的数据的解决方案。由于我们的数据集是小于 50 GB,所以我们决定使其保持简单并且设置了单一的主/从配置。若要托管此配置,我们在虚拟网络内的两个 CentOS 7.1 虚拟机在 Azure 上创建。每个虚拟机包含为 56 GB 内存、 静态 IP 地址和 SSH 终结点使用 AES256 加密。由于这两个 Vm 共享提供的一组,Azure 将提供 99.95 %sla 保证正常运行时间。另一个好处,我们创建的所有资源被都附加到资源组创建专为此解决方案,使我们能够监视和管理在每月的基础上计费。在几分钟内,我们的虚拟机已部署并对我们可用。
站着我们的 Redis 服务器是简单和造诣颇也在一小时内。在下载并安装到我们新创建的服务器上的最新稳定版本之后, 我首先想知道我们修改了配置文件以允许 Redis 所调用的仅限追加的文件 (说明) 持久性。简单地说,这意味着发送到我们的实例的每个命令会存储到磁盘。如果要重新启动服务器,所有则重新执行命令,将服务器还原到其原始状态。若要消除臃肿的说明,BGREWRITEAOF 命令,将触发有时,重写命令重新生成内存中的当前数据集所需的最短序列的文件。此外,我们配置了 50 GB,创建一个缓冲区,并且如果加载的数据过多占用了所有的系统内存会阻止 Redis 的最大内存用途。这一点,如果我们的解决方案曾经需要更多内存,我们可以轻松地调整 VM 使用 Azure 门户的大小和更新配置更高版本。接下来,我们配置了要确认创建的数据复制到主机的从属服务器实例。如果主实例变得不可用,从设备实例会准备好为客户端提供服务。最后,我们重新启动 Redis 服务器进行配置后,才会生效。下面是我们使用的配置:
~~~
appendonly yes
maxmemory 50000000000
slaveof 10.0.0.x 6379
# cluster-enabled no
~~~
## 数据加载和基准测试
我们需要从我们的传统数据库加载到 Redis 的数据包含大约 4 GB 的客户的元数据。此元数据是每日更新,因此我们需要创建一个进程定期将其转换成 Redis 数据类型和大容量加载它以使我们的解决方案保持最新。若要执行此操作,我们创建自动化的过程以提取到 Redis 协议格式的文件中的每日更改集,并传输到使用可用的 SSH 终结点的主服务器。在主实例中,我们创建了 bash 脚本,以进行大容量加载文件使用管道模式。若要强调,管道模式是解决方案的因为我们很快就在 5 分钟内加载 28 万条记录我们的关键元素。请注意,但是,该管道模式下尚不可用群集实现兼容。在我们最初的原型设计阶段,我们发现,将 28 万条记录加载到群集需要花费大量时间因为记录已单独传输。这是在我们的决策,以保持简单的主/从实现的设计中一个重要的因素。管道模式命令和响应的单个实例如下所示:
~~~
$ cat data.txt | redis-cli –pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1000000
~~~
在管道模式下执行之后, 响应指示接收到多少个错误和答复。我们分析的脚本中此响应、 存档的文件和电子邮件通知发送给相应的技术团队。对于每个错误,技术无法评估提取并快速确定需要重新加载任何数据。在完成后的日常处理脚本,我们计算速度达到我们使用 Redis 基准检验实用程序的实现。图 1 显示我们的解决方案,它会满足我们的 SLA 要求 reassuring 我们的性能结果。
![](https://box.kancloud.cn/2016-01-08_568f2a8419464.png)
图 1 Redis 基准
## 服务层
它非常重要,我们的客户端是我们的解决方案的唯一消耗者。幸运的是,Azure 可简化此任务使用访问控制服务使我们能够创建 OAuth 提供程序专用于我们的解决方案。实现后,我们的服务所需的每个请求,使用新令牌在 5 分钟后重新生成特定的令牌。同时也请注意,该令牌应始终保持不变到期前。请求新令牌为每个服务调用将实质上是妨碍您的解决方案或者,更糟糕的是,使其无法访问如果超过指定由 Azure 的请求限制。我们强烈建议任何人利用读取 Azure 的文档,然后再在生产环境中实现此功能。
有多个 C# Redis 客户端,但我们使用 StackExchange.Redis,因为我们认为它是最流行且成熟。因为所有的数据存储在组中,我们使用 LRANGE 命令来查询数据。若要防止每个查询的重新连接,使用 StackExchange.Redis 的连接将在一个单独模式中管理。中的示例 图 2 演示我们如何检索数据。
图 2 连接到 Redis 和检索数据
~~~
private static Lazy<ConnectionMultiplexer> lazyConnection =
new Lazy<ConnectionMultiplexer>(() => {
return ConnectionMultiplexer.Connect(
ConfigurationManager.AppSettings[Constants.AppSettings.RedisConnection]);
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
public async static Task<MemberResponse> MemberLookup(MemberRequest request)
{
MemberResponse response = new MemberResponse();
try
{
if (request != null && request.customer != null && request.customer.Count() > 0)
{
foreach (var customer in request.customer)
{
Customer c = customer;
RedisKey key = GetLookupKey(c);
IDatabase db = Connection.GetDatabase();
c.policies = await db.ListRangeAsync(key, 0, -1, CommandFlags.None);
response.customer.Add(c);
}
response.success = true;
}
else
{
response.exceptions = new List<ServiceException>();
response.exceptions.Add(Classes.ErrorCodes.Code_101_CustomerRequired);
response.success = false;
}
}
catch (Exception ex)
{
response.exceptions = new List<ServiceException>();
response.exceptions.Add(Classes.ErrorCodes.Code_100_InternalError);
response.success = false;
Logging.LogException(ex);
}
response.executedOn =
Utils.FormatEST(DateTime.UtcNow).ToString(Constants.DateTimeFormat);
return response;
}
~~~
若要承载我们在 Azure 中的解决方案,我们创建了一个 Web 应用程序。为获得最佳性能非常重要,我们部署 Web 应用程序到 Redis 实例所在的同一区域。一旦部署该应用程序后,我们创建 VNET 连接到我们 Redis 虚拟网络,允许服务以获取对数据的直接访问权限。此连接中进行了演示 图 3。
![](https://box.kancloud.cn/2016-01-08_568f2a843ff6e.png)
图 3 VNET 集成连接
配置此 Web 应用扩展到基于 CPU 使用情况的 10 个实例。因为我们的解决方案的流量很多种,Web 应用程序才可缩放在必要时。一层额外的安全,SSL 证书被应用到应用程序,以及 IP 筛选专门为我们的客户端。尽管应用程序被配置为自动缩放,但它不自动故障转移。为了最大化到我们的客户端的解决方案的可用性,我们创建的主 Web 应用程序中,克隆,但放在不同的区域。这两个应用程序已添加到 Azure Traffic Manager,后者我们利用进行自动故障转移。
最后,我们购买自定义域,并创建一个指向完成我们的实现我们流量管理器 URL 的 CNAME 记录。若要监视的每日我们的解决方案的性能,我们已购买 New Relic 直接从 Azure 应用商店的实例。通过使用 New Relic 中,我们无法快速确定需要改进,以及服务器的可用性的方面。
## 总结
通过将此解决方案部署到 Azure,我们学到了如何使不同的技术堆栈配合快速以提供一个功能强大、 成功的解决方案。尽管将解决方案部署到 Azure 不会清除服务器维护,如果您按照位置中的模式,则必须成功。根据您的解决方案的平均持续时间,您可以保存对硬件成本的所有解决方案都迁移到云。
实现结束时,平均响应时间为 25 毫秒为 50 个并发用户。根据这些结果,响应时间是每 15 添加的并发用户的扩展大约 10 毫秒。
* * *
Sean Iannuzzi *是 Harte 衷心感谢 h e a d 的技术,已在发挥着关键作用中的大量的社交网络,大数据的技术和业务前景之间的隔阂 20 多年来,本技术行业中数据库解决方案,云计算、 电子商务和今天的财务应用程序。Iannuzzi 具有与 50 多个独特的技术平台的体验、 已取得了很多技术的奖励认证和专门从事推动技术指导和解决方案来帮助实现业务目标。*
Johnny Webb *是 Harte 衷心感谢的软件架构师和已经实施了尖端技术为人所熟知的客户端使用过去十年中的高质量解决方案。他的专业知识包括完整的软件开发生命周期,以及 Microsoft.NET Framework 中,软件体系结构、 云计算,Web 开发、 移动开发、 API 开发、 SQL 数据库和 NoSQL 数据库。*
- 介绍
- Visual Studio - 用于 Web 开发的新式工具: Grunt 和 Gulp
- 新员工 - 放长钱钓大鱼
- Microsoft Azure - Azure Service Fabric 和微服务体系结构
- 数据点 - Aurelia 与 DocumentDB 结合: 结合之旅(第 2 部分)
- 游戏开发 - Babylon.js: 构建 Web 基本游戏
- 测试运行 - 面向 .NET 开发者的 Spark 简介
- Xamarin - 使用 Xamarin.Forms 构建跨平台用户体验
- 孜孜不倦的程序员 - 如何成为 MEAN: 快速输入
- Microsoft Azure - Azure、Web API 和 Redis 如何有助于加快数据交付
- 必备 .NET - 设计 C# 7
- 新式应用 - 需要了解的 Windows 10 应用开发概念
- 别让我打开话匣子 - 重构高等教育
- 编者注 - 再见 Kenny