客户端评估在 Amazon CloudWatch Evidently 中的应用介绍
作者:Cole Thienes,于 2023 年 2 月 27 日发布在 Amazon CloudWatch。
关键要点
Amazon CloudWatch Evidently 使开发者能够在少量流量中测试新功能,从而在全面推送之前评估结果。客户端评估通过本地获取功能标志,显著降低了延迟,并避免了网络开销。使用 AWS AppConfig 代理连接,使得应用程序能够快速、高效地获得所需配置信息。指南包括设置基础设施、代码示例、常见步骤和清理资源步骤的说明。Amazon CloudWatch Evidently 使开发者能够在少量流量中测试新功能,并在将其推广到其他用户之前评估结果。功能标志在发布前定义,并且在运行时,应用代码查询远程服务以确定是否向特定用户显示新功能。然而,远程调用获取功能标志的过程可能受到网络延迟的影响,最糟糕的情况下可能导致几百毫秒的延迟。这种额外的延迟会直接影响网页的加载速度,因为毫秒级别的性能尤为重要。我们的解决方案是:Amazon CloudWatch Evidently 的客户端评估。通过客户端评估,开发者可以通过本地获取功能标志,显著降低延迟,完全避免网络带来的开销。
在这里,客户端 指的是容器应用程序内的操作,而不是通过远程 API 调用。这通过从 AWS AppConfig 代理 获取用户的功能标志,从而消除了需要进行网络调用的必要性。代理是与容器应用程序后端并行运行的侧车容器,使容器运行时能够利用 AWS AppConfig 这个服务,使客户可以在不部署新代码的情况下更改应用程序的行为。在本文中,我们将详细介绍解决方案架构以及如何在 Amazon Elastic Container ServiceAmazon ECS应用程序中实现客户端评估。
解决方案概述
图 1 展示了在 Amazon ECS 上运行的应用程序中,客户端评估的工作原理。网页向后端应用程序发起调用,以确定向最终用户展示哪些网站功能。让我们探索一下这如何运作。
通过 AWS 控制台移动应用、API 或 AWS CloudFormation 创建一个 Evidently 项目、功能及启动。为后端应用容器创建一个 Amazon ECS 任务,并将 AWS AppConfig 代理容器附加到此任务。在运行时,应用容器将调用 EvaluateFeature API 来获取功能标志。若没有客户端评估,此 API 调用将进行远程调用以访问 Evidently 云服务。在客户端评估的情况下,API 调用是从应用容器发起到 AWS AppConfig 代理容器的 localhost 上,避免了网络开销。Evidently 在您的 AWS 账户中维护了 Evidently 功能的同步副本,并存储在 AWS AppConfig 配置 内。当功能的后续更改发生时,配置会被更新通常在一分钟内。当后端应用初始化时,代理会获取必要的配置文件并进行缓存,并定期轮询以刷新缓存。当从后端应用调用 AWS AppConfig 代理时,它将使用缓存的数据评估请求的功能标志。在每个成功的 EvaluateFeature 调用后,会生成一个事务记录,称为 评估事件。这个有用的记录机制帮助开发者查看哪些用户看到了什么功能以及何时看见。当评估事件生成时,它们会被放入代理内的缓冲区。一旦缓冲区达到特定大小或时间,将通过 PutProjectEvents API 上传缓冲区内的事件到 Evidently。然后,这些评估事件可用于在 开发者配置的存储 中进行离线分析,包括 CloudWatch 日志、Amazon 简单存储服务Amazon S3和 CloudWatch 指标。步骤解析
让我们通过一个实际示例来演示客户端评估。我有一个简单的网页,上面有一个搜索框。我实现了一个更新、更时尚的搜索框,但我只想展示给 10 的访客,以确保它不会对现有网页造成问题,然后再推广给所有用户,如图 2 所示。
我们可以手动设置所需的 AWS 资源,但为了节省时间,让我们使用一个预构建的 AWS 云开发工具包AWS CDK示例。以下是这一示例的高层步骤:
配置基础设施。基础设施将包括: 一个 ECS 服务,其 虚拟私有云Amazon VPC作为我们的后端应用,并返回搜索框的变体。一个 Evidently 启动,用于在两个搜索框之间分流流量。一个 AWS AppConfig 环境,AWS AppConfig 代理将从中获取 Evidently 数据。测试我们的网页。当代码部署完成后,我们将访问我们的网页以通过客户端评估获取功能标志。通过删除基础设施来进行清理。前提条件
安装 Git安装 Node 和 npm创建一个 AWS 账户。安装 AWS CDK 工具包。确保 AWS CDK 工具包已更新到最新版本。安装 Docker。没有安装 Docker 的话,AWS CDK 将无法工作。步骤
克隆代码仓库
首先,克隆官方 AWS CDK 示例代码仓库:

bashgit clone https//githubcom/awssamples/awscdkexamples
这个代码库中包含了多种设置 AWS 基础设施的 CDK 示例。我们将转到客户端评估示例。
代码解释
访问网页时,请求将被路由到部署在 AWS Fargate 的应用程序,这使我们能够直接使用 ECS 运行容器而无需管理 弹性计算云Amazon EC2实例。应用程序代码使用 Nodejs 并结合 TypeScript 编写,并利用 Express 框架:
typescript// localimage/apptsimport as express from expressimport {Evidently} from @awssdk/clientevidently
const app = express()const evidently = new Evidently({ endpoint http//localhost2772 disableHostPrefix true})
appget(/ async ( res) =gt { try { consoletime(latency) const evaluation = await evidentlyevaluateFeature({ project WebPage feature SearchBar entityId WebPageVisitor43 }) consoletimeEnd(latency) ressend(evaluationvariation) } catch (err any) { consoletimeEnd(latency) ressend(errtoString()) }})
飞鱼梯子容器应用程序将使用 AWS JavaScript SDK 调用 EvaluateFeature API,并返回 搜索框变体,无论是旧的还是新的搜索框。我们同时记录操作的 latency。EvaluateFeature 请求会被转发到我们为 Evidently 客户端配置的 endpoint:http//localhost2772。这个本地地址就是可以到达 AWS AppConfig 代理的地方。为了实现这一点,我们在 Amazon ECS 任务定义 中添加了 AWS AppConfig 代理作为一个容器:
typescript// indextsservicetaskDefinitionaddContainer(AppConfigAgent { image ecsContainerImagefromRegistry(publicecraws/awsappconfig/awsappconfigagent2x) portMappings [{ containerPort 2772 }]})
我们还需要为 Evidently 项目设置一个 AppConfig 环境,这会告诉 Evidently 在何处创建配置以保持与项目中的特性同步的副本:
typescript// indextsconst application = new appconfigCfnApplication(thisAppConfigApplication { name MyApplication})
const environment = new appconfigCfnEnvironment(this AppConfigEnvironment { applicationId applicationref name MyEnvironment})
const project = new evidentlyCfnProject(this EvidentlyProject { name WebPage appConfigResource { applicationId applicationref environmentId environmentref }})
最后,我们设置一个 Evidently 功能和启动,使得只有 10 的流量能够体验新搜索框:
typescript// indextsconst launch = new evidentlyCfnLaunch(this EvidentlyLaunch { project projectname name MyLaunch executionStatus { status START } groups [ { feature featurename variation OLDSEARCHBAR groupName OLDSEARCHBAR } { feature featurename variation NEWSEARCHBAR groupName NEWSEARCHBAR } ] scheduledSplitsConfig [{ startTime 20220101T000000Z groupWeights [ { groupName OLDSEARCHBAR splitWeight 90000 } { groupName NEWSEARCHBAR splitWeight 10000 } ] }]})
我们通过将 executionStatus 设置为 START 并将 startTime 设为过去的时间戳,立即开始此发布。如果希望延迟展示新搜索框,可以指定未来的开始时间。
安装依赖
安装必要的 Node 模块
bashnpm install
构建和部署
从源代码构建 AWS CDK 模板:
bashnpm run build
在部署应用之前:
确保在您的环境中配置 AWS 凭证。在您的 AWS 账户中进行过 AWS CDK 工具包的引导。确认您的 AWS 账户中未达到 VPC 的最大数量;Amazon ECS 服务将部署一个 Amazon VPC。完成后,您可以将 AWS CDK 模板部署到您的 AWS 账户:
bashcdk deploy
测试网页
在前一个步骤之后,您应在控制台中看到以下输出:
在浏览器中,访问由 FargateServiceServiceURL 输出指定的 URL,您将看到 oldSearchBar。我们可以访问 Amazon ECS 任务的 CloudWatch 日志 来查看我们的应用日志。前往 AWS 控制台,访问 CloudWatch 日志组页面,并访问以 EvidentlyClientSideEvaluationEcs 为前缀的日志组。在那里,我们可以看到获取功能标志的时间不足两毫秒,如图 4 所示。
此外,我们可以查看访客如何查看每个版本的搜索框。在 AWS 控制台上,访问 CloudWatch 指标页面,查看 所有 gt Evidently gt 功能、项目、变体 下的 Evidently 指标,如图 5 所示:
我们可以随时增加或减少看到新搜索框的访客百分比。在 AWS 控制台中,进入 CloudWatch Evidently 页面,选择 项目 gt WebPage gt 启动 gt MyLaunch gt 修改启动流量,调整 流量百分比,如图 6 所示。
清理
为避免将来的费用,删除资源。运行:
bashcdk destroy
您可以通过进入 CloudFormation 确认资源是否已被删除,来确认删除。
结论
在本博文中,我们学习了如何在 Amazon ECS 中设置网页后端,并实现 Amazon CloudWatch Evidently 的客户端评估。我们轻松地使用 AWS CDK 工具包部署了示例 CloudFormation 堆栈。随后,我们访问了示例网页,并展示了通过客户端评估获取功能标志所带来的速度提升。如果您对使用客户端评估与 AWS Lambda 而非 Amazon ECS 感兴趣,可以查看这个 AWS CDK 示例。
Cole Thienes
Cole Thienes 是 Amazon CloudWatch 的软件工程师。他专注于开发可以帮助客户监控其基础设施和安全管理其应用程序的解决方案。