简化后端服务的 A/B/n 测试

2022-12-21 0 1,058

每星期撷取新一代,最盛行的软件设计科学知识与新一代金融行业态势,期望我们能全屏帕西基,喔全力支持,下跪关注,点赞,回帖。

简化后端服务的 A/B/n 测试

介绍怎样采用 Iter8 SDK 在 Kubernetes 中随心所欲运转 A/B/n 试验。Iter8 宪州您的插件/ML 数学模型搜集销售业务分项显得单纯。

A/B/n 试验,或分拆试验,是一类试验操作过程,采用者网络流量通过该操作过程乱数原产在插件(或插件模块)的三个或数个版间。评估结果销售业务分项以确认获得胜利版——造成Villamblard利润率或销售业务商业价值的版。比如,网购插件可能将采用总收入和采用者参与程度做为销售业务分项。

他们著眼于布署在 Kubernetes 中的后端服务项目的 A/B/n 试验。比如,在右图中,后端可能将是一个基于Node.js的新浪网零售店。它倚靠后端所推荐服务项目向采用者提供更多商品提议。他们有兴趣对所推荐服务项目的数个版进行 A/B/n 试验。在图中,他们有三个版,v1(现阶段或预设版)和v2 (备选版)。

简化后端服务的 A/B/n 测试

排序销售业务分项

A/B/n 试验倚赖对销售业务分项的评估结果。这些分项来衡量插件某一版的益处或商业价值。比如,在新浪网零售店插件中,有关分项可能将是营收或采用者参与程度。销售业务分项是某一于插件的;它不能由基础建设排序,而要由插件这类排序。当营收等分项由插件模块(如下面的后端新浪网零售店)排序时,间接主要包括了后端所推荐发动机的重大贡献。但,后端模块难以将测度值与某一版的后端密切有关,因为它一般来说不知道采用了别的版的后端服务项目。

Iter8 SDK

为了正确地将分项归因于后端版,后端有必要知道每个采用者会话正在采用别的后端版。为了协助后端服务项目,可以采用 Iter8 SDK。Iter8是一个开源的Kubernetes发布优化器,可以帮助您在几秒钟内开始试验 Kubernetes 插件。采用 Iter8,您可以执行各种试验,比如 SLO 验证、金丝雀试验、混沌注入试验,以及现在的 A/B/n 试验。Iter8 SDK 提供更多了三个接口:

Lookup(component, user_session),它标识一个模块的版,调用者应该采用该版向给定的采用者会话发送请求。

WriteMetric(metric_value, component, user_session),它将测度与模块的所推荐版密切有关。

下面的序列图显示了他们的网购插件对这些接口的采用:

简化后端服务的 A/B/n 测试

为响应采用者请求,后端模块调用Lookup()以确认要采用别的版的后端模块。返回固定数量的采用者定义曲目标签Lookup()之一。保证为相同的采用者会话所推荐相同的曲目标签,确保后续对后端的调用将发送到相同的版。然后,后端服务项目将其请求发送到所推荐的后端,采用轨道做为路由的关键。当后端稍后为采用者会话排序销售业务分项时,它可以安全地与所推荐的后端版密切有关。可用于执行此操作,从而无需后端跟踪到后端版的映射。Lookup()WriteMetric()

由于Lookup()返回一组固定的轨道标签中的一个,后端服务项目要配置为将网络流量路由到一组固定的服务项目——每个轨道一个。要跟踪的版的映射随天数变化,并且做为备选版布署的一部分采用已布署的 Kubernetes 对象上的标签完成。

显然,SDK 的引入对插件后端模块的开发人员提出了要求。此外,该方法倚赖后端插件可以根据一组轨道标识符路由后端请求的假设。这意味着对插件配置的要求。他们通过示例演示采用 Iter8 SDK 是多么容易。

Iter8 SDK 采用 gRPC 实现。该协议缓冲区文档中描述了这些接口。可以从中为各种语言生成某一于语言的代码。接口这类由 A/B/n 服务项目实现。

A/B/n 试验的插件开发

他们将考虑一个单纯的两层插件。用 Node.js 编写的后端代表一个新浪网零售店。 用Go编写的后端表示由后端调用的所推荐发动机,用于向采用者展示替代商品。可以在此处找到此插件的完整源代码。

后端模块全力支持三个接口:

/getRecommendation要求商品所推荐。/buy完成购买。

做为购买(请求)的副作用/buy,排序采用者会话的销售业务分项。接口的实现/getRecommendation倚赖后端所推荐服务项目。他们想在此后端所推荐服务项目上运转 A/B/n 试验。

Iter8 SDK 采用 gRPC 实现。该协议缓冲区文档中描述了这些接口。可以从中为各种语言生成某一于语言的代码。他们生成的代码在示例插件中,可以直接复制以用于您自己的插件。

要采用 Iter8 SDK,需要 gRPC 和生成的库:

var grpc = require(@grpc/grpc-js);var messages = require(./abn_pb.js);var services = require(./abn_grpc_pb.js);

并实例化一个客户端:

var client = new services.ABNClient(abnEndpoint, gprc.credentials.createInsecure());

此客户端用于两种用例:调用后端服务项目之前和写入分项值时。

调用后端服务项目

在调用后端所推荐服务项目之前,Lookup()需要先调用该方法。返回的轨道标识符应该用作索引来选择发送请求的路线。在他们的示例后端中,这可以按如下方式实现:

/ map of track to route to backend service

const trackToRoute = { “default”: “http://backend:8091”, “candidate”: “http://backend-candidate:8091”,}…

// identify default route

route = trackToRoute[default];…

var application = new messages.Application();application.setName(default/backend);

application.setUser(req.header(X-User));

client.lookup(application, function(err, session) {

if (!err) { // use route determined by recommended track route = trackToRoute[session.getTrack()];

} // call backend service using session.getTrack() as index to list of endpoints http.get(route + /recommend, … )}

在此实现中,采用者会话是从请求标头中提取的X-User。请注意,如果与 Iter8 SDK 交互出现任何问题,将选择预设路由。可以在此处找到完整的示例代码。

编写分项

当/buy调用接口时,表示销售完成,排序销售业务分项。在他们的示例插件中,一个乱数值被分配给分项sample_metric:

// export metricvar mv = new messages.MetricValue();mv.setName(sample_metric);

mv.setValue(random({min: 0, max: 100, integer: true}).toString());mv.setApplication(default/backend);

mv.setUser(user);

而已!不需要进一步的更改,无论运转了多少 A/B/n 试验——或者没有。

可以在此处 (Node.js)找到完整的示例后端代码。Python和Go中提供更多了替代实现。与节点示例一样,生成的代码可以直接复制到您自己的插件中。

为 A/B/n 试验布署插件

在布署将要进行 A/B/n 试验的插件模块时,唯一的要求是添加 Iter8 A/B/n 服务项目用于标识模块版的标签。在他们的例子中,他们计划只试验后端所推荐模块。

Iter8 SDK要求每个版布署的资源实例中至少有一个包含以下标签:

app.kubernetes.io/name:插件(模块)名称。

app.kubernetes.io/version: 版名称。

iter8-tools/track:要用于此版的曲目标签。

iter8-tools/abn: 指示版是否准备好接收网络流量的标志。

做为说明,可以采用以下命令手动布署示例插件。首先,布署后端新浪网零售店组件:

kubectl create deployment frontend –image=iter8/abn-sample-frontend-node:latestkubectl expose deployment frontend –name=frontend –port=8090

接下来,布署示例后端所推荐模块的现阶段或预设版。他们将所需的标签添加到布署对象中,因为他们期望在此模块上运转 A/B/n 试验。

kubectl create deployment backend –image=iter8/abn-sample-backend:latestkubectl expose deployment backend –name=backend –port=8091kubectl label deployment backend app.kubernetes.io/name=backendkubectl label deployment backend app.kubernetes.io/version=v1kubectl label deployment backend iter8.tools/track=defaultkubectl label deployment backend iter8.tools/abn=true

最后,布署 Iter8 服务项目(如果尚未布署):

helm install –repo https://iter8-tools.github.io/hub iter8-abn iter8-abn \–set “resources={deployments,services}” \–set “namespaces={default}”

运转 A/B/n 试验

他们现在准备运转 A/B 试验,比较后端所推荐模块的现阶段布署的预设版和新的备选版。运转试验有三个步骤。第一步是布署模块的一个或数个备选版。采用他们的示例插件,他们展示了布署后端所推荐发动机的备选版所需的步骤。待备选版完全布署后,Iter8 Service会开始将分配给它的track label发送给后端服务项目。做为响应,后端零售店将开始向新版的所推荐发动机发送请求。第二步是启动 Iter8 试验来评估结果搜集到的分项。他们展示了一个多循环试验——一个定期执行直到被删除的试验。在每次执行时,

布署备选版

可以以任何方式布署备选版——手动(如他们所示)或采用 CI 工作流。如上所述,要将所需标签添加到至少一个 Kubernetes 资源对象。

在他们的示例插件中布署后端所推荐服务项目的备选版本:

kubectl create deployment backend-candidate –image=iter8/abn-sample-backend:latestkubectl expose deployment backend-candidate –name=backend-candidate –port=8091kubectl label deployment backend-candidate app.kubernetes.io/name=backendkubectl label deployment backend-candidate app.kubernetes.io/version=v2kubectl label deployment backend-candidate iter8.tools/track=candidate

在布署备选版时,要注意确保备选版在前端向其发送任何请求之前已完全初始化。这可以通过仅在备选版完全初始化后设置 iter8-tools/abn 标签来确保。一旦初始化,Iter8 A/B/n 服务项目将开始提供更多响应Lookup()请求的版。

kubectl label deployment backend-candidate iter8.tools/abn=true

这些步骤如右图所示。最初,仅布署预设版 v1 并接收来自后端的所有网络流量。简化后端服务的 A/B/n 测试

当布署备选版 v2 时,后端继续将所有请求发送到预设版。

简化后端服务的 A/B/n 测试

一旦备选版准备好接收网络流量,比如,当 pod 为 时Ready,设置标签iter8.tools/abn。这会触发 Iter8 服务项目开始向前端所推荐它,而后端又开始向三个版发送请求。在他们的示例插件中:kubectl label deployment backend-candidate iter8.tools/abn=true

简化后端服务的 A/B/n 测试实际上,试验取决于应用到后端服务项目的采用者负载。在本教程中,他们采用将请求发送到存储端点的脚本来应用负载,/getRecommendation并/buy.采用将本地请求转发到集群:kubectl port-forward svc/frontend 8090:8090

并为不同的采用者生成负载;比如,对于采用者foo和foobar:

curl -s https://raw.githubusercontent.com/iter8-tools/docs/main/samples/abn-sample/generate_load.sh | sh -s — -u foo

curl -s https://raw.githubusercontent.com/iter8-tools/docs/main/samples/abn-sample/generate_load.sh | sh -s — -u foobar

启动 Iter8 试验

启动 Iter8 试验以定期读取通过 编写的销售业务分项WriteMetric()。可以采用预定义的 abnmetrics 任务:

iter8 k launch \–set “tasks={abnmetrics}” \–set abnmetrics.application=default/backend \–set runner=cronjob \–set cronjobSchedule=”*/1 * * * *”

此命令启动 Iter8 试验,该试验运转预定义的 abnmetrics 任务以读取在预设命名空间中运转的后端插件模块的记录分项。采用 cronjob runner 表示试验将根据 cronjobSchedule 定期运转(在本例中为每分钟一次)。试验结果将随天数更新。

检查试验结果并决定是否推广备选版。第一份报告将在试验任务第一次运转后(大约一分钟)可用。示例报告如下:

iter8 k report Experiment summary: ******************* Experiment completed: false No task failures: true Total number of tasks: 1 Number of completed tasks: 18 Latest observed values for metrics: *********************************** Metric | candidate | default ——- | —– | —– abn/sample_metric/count | 765.00 | 733.00 abn/sample_metric/max | 100.00 | 100.00 abn/sample_metric/mean | 50.11 | 49.64 abn/sample_metric/min | 0.00 | 0.00 abn/sample_metric/stddev | 28.63 | 29.25

提升赢家

在推广备选版时,必须注意确保没有采用者网络流量意外发送到正在升级或删除的版。任何可用于执行促销的方法都应主要包括以下步骤。还显示了示例插件的手动步骤。

最初,预设版和备选版都从后端接收请求。

简化后端服务的 A/B/n 测试

首先,iter8.tools/abn从与预设版关联的资源中取消设置标签。这会在转换期间禁用到预设版的网络流量——Iter8 SDK 接口Lookup()将从其所推荐后端列表中删除预设轨道:

kubectl label deployment backend iter8.tools/abn-

简化后端服务的 A/B/n 测试

接下来,采用新版重新布署与预设轨道关联的对象。

简化后端服务的 A/B/n 测试

更新的对象准备就绪后,添加指示iter8.tools/abn它已准备好接收网络流量的标签。

kubectl label deployment backend iter8.tools/abn=true

简化后端服务的 A/B/n 测试

此时,预设和备选轨道标签都与相同的后端版密切有关。现在可以删除备选版。为此,取消设置iter8.tools/abn标签以终止到备选资源的网络流量:

kubectl label deployment backend-candidate iter8.tools/abn-

简化后端服务的 A/B/n 测试

最后,删除备选资源。

kubectl delete deployment backend-candidatekubectl delete service backend-candidate

简化后端服务的 A/B/n 测试

最后的想法

他们探讨了进行 A/B/n 试验的一些挑战,尤其是插件的后端服务项目。关键挑战涉及后端模块排序销售业务分项难以正确地将它与有助于其排序的后端版密切有关。Iter8 SDK 使后端能正确地建立这种关联。它通过提供更多一个查找接口来实现这一点,该接口允许前端服务项目识别后端服务项目的版以在处理采用者请求时采用。这样,它可以可靠地将销售业务分项分配给后端版。他们展示了采用 Iter8 SDK 修改后端服务项目和运转 A/B/n 试验是多么容易。

只需要几行额外的代码就可以对后端进行一次性更改。启用备选版进行试验只需要添加一些标签。

试用本教程后,采用您自己的插件进行试用。

举报/反馈

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务