支持对静态 .NET Framework 应用程序进行动态扩展 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

支持对静态 .NET Framework 应用程序进行动态扩展

概述

将云用于应用程序的一大关键优势在于其弹性,即可以根据需求灵活地横向扩展或缩减计算资源的使用量。这使得您只需为实际所需的计算容量付费,而无需为峰值使用量进行预调配。“网络星期一”是一个很好的例子,说明了弹性经济的概念。在这个特殊日子里,线上零售商能够获得比平时高出数倍甚至更多的流量(例如,短短几分钟内达到数千个百分点的增幅)。

如果您要将遗留的 .NET Web 应用程序迁移到云中(例如,在 IIS 上运行的 ASP.NET Framework 应用程序),由于应用程序的有状态特性,可能难以或无法快速扩展负载均衡的服务器场。用户会话数据存储在应用程序的内存中,通常与保留必须持久保存的跨请求数据的 ASP.NET 会话状态或静态变量一起存储。用户会话亲和性通常通过负载均衡器的粘性会话来保持。

事实证明,这在操作上具有挑战性。当需要增加容量时,您必须有意预调配并添加服务器。这可能是一个缓慢的过程。在进行补丁安装或出现意外故障时,若要将节点停用,可能会对最终用户体验造成影响,从而使所有与受影响节点相关联的用户都将丢失状态。最理想的情况是,这只需要用户再次登录即可。

通过为 ASP.NET 应用程序集中管理会话状态,并对遗留的 ASP.NET 应用程序应用自动扩展规则,您可以充分利用云的弹性,并在运行应用程序时可能节省成本。例如,通过计算资源可扩展性,您可以降低成本,同时您还可以选择不同的定价模式,比如减少预留实例的使用量并采用 Amazon 竞价型实例定价

两种常见的技术包括使用亚马逊 DynamoDB 作为会话状态提供程序和使用 ElastiCache 亚马逊(Redis OSS)作为 ASP.NE T 会话存储。

下图显示了将 DynamoDB 用作会话状态提供者的架构。

DynamoDB 作为会话状态提供者

下图显示了使用 ElastiCache (Redis OSS) 作为会话状态提供程序的架构。

ElastiCache (Redis OSS) 作为会话状态提供者

成本影响

要确定扩展为生产应用程序带来的益处,我们建议您对实际需求进行建模。本部分基于以下假设来构建一个示例应用程序模型:

  • 添加和从旋转操作中移除的实例是完全相同的,并且不会带来实例大小的变化。

  • 服务器的利用率始终不会低于两台活动服务器,以维持应用程序的高可用性。

  • 服务器的数量会与流量呈线性关系扩展(也就是说,流量增加一倍,所需的计算能力也会增加一倍)。

  • 以六小时为增量对一个月的流量进行建模,其中包含日内差异以及一天中出现的一次异常的流量高峰(例如,促销活动期间的流量会达到平时的 10 倍)。基于基础利用率对周末流量进行建模。

  • 夜间流量按照基础利用率进行建模,而工作日的流量则按照 4 倍的利用率进行建模。

  • 预留实例定价采用为期一年的无预付定价。普通的日间定价采用按需定价模式,而爆发需求则采用竞价型实例定价模式。

下图说明了此模型如何在 .NET 应用程序中充分利用弹性特性,而非为峰值使用量进行预调配。这样可以节省大约 68% 的成本。

自动扩缩成本图表

如果您使用 DynamoDB 作为会话状态存储机制,请使用以下参数:

Storage: 20GB Session Reads: 40 million Session Writes: 20 million Pricing Model: On demand

这项服务的每月预计费用约为 35.00 美元。

如果您使用 ElastiCache (Redis OSS) 作为会话状态存储机制,请使用以下参数:

Number of Nodes: 3 Node size: cache.t4g.medium Pricing Model: 1y reserved

这项服务的每月预计费用约为 91.00 美元。

成本优化建议

第一步是在遗留的 .NET 应用程序中实施会话状态管理。如果您使用 ElastiCache 作为状态存储机制,请按照 AWS 开发者工具博客中ElastiCache 作为 ASP.NET 会话存储中的指导进行操作。如果您使用的是 DynamoDB,请按照文档中的内容中的指导进行操作 适用于 .NET 的 AWS SDK。 适用于 .NET 的 SDK

如果应用程序一开始就使用InProc会话,请确保计划存储在会话中的所有对象都可以序列化。为执行此操作,请使用 SerializableAttribute 属性来修饰那些实例将被存储在会话中的类。例如:

[Serializable()] public class TestSimpleObject { public string SessionProperty {get;set;} }

此外,所有正在使用的服务器上的 .NET MachineKey 必须保持一致。通常情况下,如果实例是基于通用的亚马逊机器映像(AMI)创建的,就会出现这种情况。例如:

<machineKey validationKey="some long hashed value" decryptionKey="another long hashed value" validation="SHA1"/>

然而,重要的是确保在更改基础映像时,其配置应与相同的 .NET 机器映像保持一致(这种配置可以在 IIS 或服务器级别进行设置)。有关更多信息,请参阅SystemWebSectionGroup。 MachineKey 微软文档中的属性

最后,您必须确定在响应扩展事件时向自动扩缩组添加服务器的机制。我们可以通过多种方式来完成此操作。我们建议使用以下方法将.NET 框架应用程序无缝部署到 Auto Scaling 组中的 EC2实例:

其他资源