从 Amazon SDK for .NET 中,获取 .NET 应用程序的最佳性能

云计算
re:Invent
0
0
## 视频 <video src="https://dev-media.amazoncloud.cn/30-LibaiGenerate/31-LiBaiRebrandingVideo/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET-LBrebrandingWCaptionCN.mp4" class="bytemdVideo" controls="controls"></video> ## 导读 对于 .NET 开发人员,通过 Amazon SDK for .NET 使用亚马逊云科技服务构建应用程序至关重要。本论坛超越了向服务发出请求的简单示例,并展示了使用 SDK for .NET,最大限度地提高性能和可靠性的先进方法。在本论坛中,还能学习许多鲜为人所知的细微功能和调优选项,这些功能和选项可能会产生显著的效果,其中包括用于调整重试、超时和 HTTP 客户端处理的功能,以及用于自定义 SDK 发出的 HTTP 请求的功能。 ## 演讲精华 <font color = "grey">以下是小编为您整理的本次演讲的精华,共1400字,阅读时间大约是7分钟。如果您想进一步了解演讲内容或者观看演讲全文,请观看演讲完整视频或者下面的演讲原文。</font> 诺曼·约翰松,一位亚马逊云科技的首席工程师,在演讲开始时介绍了自己的研究方向。他专注于亚马逊云科技的.NET工具,包括.NET SDK、Lambda库、CLI工具和Visual Studio集成等方面的工作。其主要目标是让听众深入了解SDK在底层的运行机制,以便开发者能够更好地定制SDK以满足特定的性能需求。 约翰松表示,.NET SDK在亚马逊云科技有着悠久的历史,截至目前已经经历了两个主要版本的更新,最新的版本是在2015年发布的第3版。随着版本的更迭,团队一直致力于确保公共API的稳定性,以避免升级过程中破坏现有客户的代码。 为了证明这种稳定性,约翰松展示了从SDK 1和SDK 3的代码示例。除了一些微小的调整,如将异步/等待支持添加到版本3中,编码模式和总体结构基本保持一致。他甚至表示,即使是为版本1编写的代码,在转换为版本3时也不会出现问题。只需进行轻微的修改,这就体现了团队避免破坏性改变的承诺。 接着,约翰松转向探讨了服务客户端使用的最佳实践。他建议与会者尽量重用服务客户端,而不是每次请求都创建新的客户端。因为每次重复创建新客户端可能导致因需每次解析凭证而降低效率。然而,一旦客户端建立完成,它将变得轻量级且线程安全,能够在多次请求间安全地重复使用。 为了展示这一观点,约翰松编写了一个示例代码,演示了在每个循环迭代中都创建新的S3服务客户端的情况,共进行了5次迭代。这导致了对EC2元数据服务的不必要调用,以获取每次循环的凭证。然后,他将代码重构为一个可重用的单一服务客户端,从而消除了不必要的开销。 约翰松强调,在整个应用程序的生命周期中,服务客户端应被缓存并在依赖注入容器中保持一个实例。他提醒道,如果每个请求都要定期重新解决凭证或客户端,可能会导致扩展时的瓶颈。 Johnsson在讨论SDK的处理方式时,探讨了如何在每个服务基础上对HTTP客户端进行池化处理,以减少握手开销。他在Fiddler中展示了一个例子,即使进行了重复的服务调用,通过这种池化行为,也只发生了一次HTTP连接握手。虽然此池化功能默认为启用状态,但如果需要,也可以禁用。一个可能的场景是在不稳定网络环境中运行并希望每次强制建立新连接的情况。除了少数特殊情况外,Johnsson建议在性能方面考虑保留启用池化功能。 此外,Johnsson还解释了如何在SDK服务客户端层进行完全定制。这是通过在构建服务客户端时提供自定义HTTP客户端工厂来实现的。然后,可以在自定义工厂内处理任何需要修改的内容,如套接字处理器、请求头等。 需要注意的是,在修改请求时,它们已经过签名。因此,添加自由的头信息是可以的,但修改正文、查询字符串或其他已签名的部分可能导致签名无效。 Johnsson还介绍了SDK如何处理失败的请求的重试。默认情况下,对于I/O问题、抑制和500级别的服务错误等错误,会尝试重试多达3次,采用指数退避。值得注意的是,DynamoDB默认重试10次而非3次。他演示了如何配置一个自定义的最大错误重试值以更改尝试的重试次数。在他的示例中,他将它设置为3而不是DynamoDB的默认10次。Johnsson还展示了“自适应”模式,该模式会根据检测到的抑制错误来限制请求,以便与观察到的服务容量相匹配。这有助于在表供应不足时避免级联故障。 Johnsson强调了对共享服务客户端的好处,因为这样SDK可以跟踪请求的健康状况并根据情况进行相应的调整。他总结了重试配置,强调了针对大量抑制工作的自适应模式。 在更高的SDK功能层面上,Johnsson讨论了文档和对象持久模型。这些提供了将.NET对象映射到DynamoDB表的辅助方法。他指出的一个常见问题是,它们在启动时会发出DescribeTable调用来获取表元数据。 他展示了如何借助额外的DescribeTable调用来提高延迟性,尽管这会增加除预期GetItem调用之外的额外负载。对于Lambda等对冷启动性能有要求的应用而言,在初始化阶段进行此元数据调用可能会导致问题。 幸运的是,Johansson强调了一个最近新增的选项,该选项可以禁用初始元数据获取。取而代之的是,必须提前通过TableBuilder提供表模式。他展示了一个示例,说明如何使用表名称、键和索引定义来构建TableBuilder。这样,SDK就可以在不访问服务的情况下获取所需的元数据。 此外,还有一种技术是使用属性来装饰模型类以定义模式。这样可以在不改变现有模型的前提下,仍能提供预定义的元数据。在这两种情况下,都可以避免昂贵的DescribeTable调用。 转到S3领域,Johansson提出了一种常见的使用场景,即从不可寻址的数据流中进行流式传输。默认情况下,S3 SDK期望数据流是可寻址的,以便计算内容长度。为了处理像网络流这样的不可寻址来源,他展示了一个最近添加的功能,该功能可以以5MB的块在内存中缓冲数据并使用多部分上传。 虽然这支持真正的流式传输,但他提醒说,在内存敏感的应用中应考虑缓冲区大小。总之,这个新功能提供了流式支持,而无需外部缓冲。 在演讲即将结束时,Johansson转向了关于.NET原生AOT编译的讨论。他认为原生AOT是一种消除运行时引导开销并显著改善Lambda函数冷启动时间的方法。其原理是将代码和依赖项编译成原生可执行文件。 然而,Johansson概述了一些关于原生AOT的限制和考虑因素。由于所有类型必须在编译时已知,因此反射功能受到限制。需要在AOT环境中进行全面测试,以确保修剪不会破坏行为。而且,对动态特性的支持(如加载运行时代理)有所减少。 他通过一个简单的Lambda函数编译为原生AOT的示例来说明,指出由SDK发出的大量修剪警告——总共有超过400个。这些警告表明在AOT环境下行为可能发生变化的风险,强调了需要进行严格测试的必要性。 为了减少警告,Johansson强调在最新的v3.7.300 SDK版本中,他们已对API进行了注释,以便能识别并应用修剪功能。经过重新编译使用v3.7.300版本后,结果显示警告已经消失,同时可执行文件的大小也有所减小,从15MB降到了11MB。此外,在其他AOT方面,他们还考虑了在启动时注册可选依赖项(例如STS)以及关于反射密集型库(如DynamoDB对象持久化模型)的现状限制。Johansson强调,随着客户反馈的不断提供,这些问题将逐渐得到解决。 概括而言,他的主要建议包括重用服务客户端、启用S3流处理、采用自适应重试策略以及利用原生AOT以减少冷启动时间。Johansson鼓励与会者在GitHub上提供反馈,以协助团队确定需要改进的领域。 总之,这次演讲涉及了针对亚马逊云科技上的.NET开发者的广泛的性能优化技巧。Johansson分享了一些关于服务客户端池、重试、元数据获取等方面的内幕信息。他还概述了在整个SDK中可用的一些最佳实践和定制选项。对于冷启动性能,原生AOT编译被认为是一个关键的新兴功能。演讲者最后表示欢迎持续提供反馈,以助力SDK的发展并解决诸如原生AOT支持等领域的问题。 **下面是一些演讲现场的精彩瞬间:** 目标是为开发者提供对SDK默认行为的理解,以便他们能够根据自己的应用程序需求进行定制。 ![](https://d1trpeugzwbig5.cloudfront.net/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET/images/rebranded/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET_0.png) 亚马逊云科技SDK在过去的几年里不断发展和改进,同时保持了统一的公共API,以免让开发者感到困惑。 ![](https://d1trpeugzwbig5.cloudfront.net/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET/images/rebranded/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET_1.png) 通过创建实例概要文件来按需获取凭据可能会引发规模扩大后的节流问题。 ![](https://d1trpeugzwbig5.cloudfront.net/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET/images/rebranded/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET_2.png) 建议开发者们使用STS区域端点环境变量来减少使用亚马逊云科技SDK时的延迟和隔离问题。 ![](https://d1trpeugzwbig5.cloudfront.net/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET/images/rebranded/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET_3.png) 亚马逊云科技SDK会保存状态以检测不稳定的系统、快速失败的请求,并在问题解决后恢复正常的重试行为。 ![](https://d1trpeugzwbig5.cloudfront.net/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET/images/rebranded/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET_4.png) 领导者们展示了亚马逊云科技SDK中新推出的自适应节流功能如何自动调整请求速率,以防止出现节流错误。 ![](https://d1trpeugzwbig5.cloudfront.net/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET/images/rebranded/XNT401-Getting_the_most_performance_for_your__NET_apps_from_AWS_SDK_for__NET_5.png) ## 总结 亚马逊云科技的.NET SDK工程师详细地解释了如何利用其SDK优化.NET应用程序。他强调了重用服务客户端而非每次请求都创建新客户端的重要性,以避免重复解析凭据。SDK会在内部缓存HTTP客户端以提高性能,但这项功能可进行自定义或禁用。用户还可以配置默认的重试行为和指数退避策略,包括在发生限流错误时的“自适应”模式来限制请求。 为了减少启动时间,演讲者建议在每次请求时不调用亚马逊云科技的STS,而应使用区域端点。他还展示了消除DynamoDB高级库启动时额外描述表调用的新选项。最后,他详细介绍了如何将Lambda函数的.NET本地AOT编译用于大幅提高冷启动速度,从1900毫秒降至950毫秒。然而,他也提醒道,并非所有SDK功能都与原生AOT完全兼容。总之,这个演讲为.NET开发者提供了许多实用的技巧,帮助他们优化高性能应用程序的SDK使用。 ## 演讲原文 ## 想了解更多精彩完整内容吗?立即访问re:Invent 官网中文网站! [2023亚马逊云科技re:Invent全球大会 - 官方网站](https://webinar.amazoncloud.cn/reInvent2023/?s=8739&smid=19458 "2023亚马逊云科技re:Invent全球大会 - 官方网站") [点击此处](https://aws.amazon.com/cn/new/?trk=6dd7cc20-6afa-4abf-9359-2d6976ff9600&trk=cndc-detail "点击此处"),一键获取亚马逊云科技全球最新产品/服务资讯! [点击此处](https://www.amazonaws.cn/new/?trk=2ab098aa-0793-48b1-85e6-a9d261bd8cd4&trk=cndc-detail "点击此处"),一键获取亚马逊云科技中国区最新产品/服务资讯! ## 即刻注册亚马逊云科技账户,开启云端之旅! [【免费】亚马逊云科技“100 余种核心云服务产品免费试用”](https://aws.amazon.com/cn/campaigns/freecenter/?trk=f079813d-3a13-4a50-b67b-e31d930f36a4&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技“100 余种核心云服务产品免费试用“") [【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用”](https://www.amazonaws.cn/campaign/CloudService/?trk=2cdb6245-f491-42bc-b931-c1693fe92be1&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用“")
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭