摘要:这篇文章主要介绍一个A/B测试的中间件–flagr
前言:Flagr是一个开源Go服务,可为正确的实体提供正确的体验并监视其影响。 它提供功能标记,实验(A / B测试)和动态配置。 它具有用于标志管理和标志评估的清晰的REST API。
flagr是什么?
在介绍flagr之前,我们先要明白什么是A/B测试,什么是灰度测试,这样可以让我们更好的理解flagr。
A/B测试
A/B测试指的是系统测试通过并发布后,同一个软件功能不同的用户会看到不同的实现方式,收集每个用户的反馈。本质上是上线后的测试,收集用户的反馈。即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。
灰度测试
灰度发布,又名金丝雀发布,或者灰度测试,是指在黑与白之间能够平滑过渡的一种发布方式。在其上可以进行A/B测试。
灰度发布是对某一产品的发布逐步扩大使用群体范围,也叫灰度放量。系统集成测试通过后,将测试版本发布到线上环境,替换部分的线上服务器代码进行预测试。当灰度测试结束后,线上版本实现会统一。本质上是上线前的测试,收集用户的反馈。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期。
灰度测试的意义
灰度测试能及早获得用户的意见反馈,完善产品功能,提升产品质量,让用户参与产品测试,加强与用户互动,降低产品升级所影响的用户范围。
灰度发布步骤
- 定义目标。
- 选定策略:包括用户规模、发布频率、功能覆盖度、回滚策略、运营策略、新旧系统部署策略等。
- 筛选用户:包括用户特征、用户数量、用户常用功能、用户范围等。
- 部署系统:部署新系统、部署用户行为分析系统(web analytics)、设定分流规则、运营数据分析、分流规则微调。
- 发布总结:用户行为分析报告、用户问卷调查、社会化媒体意见收集、形成产品功能改进列表。
- 产品完善。
- 新一轮灰度发布或完整发布。
flagr是什么?可以用来做什么?
Flagr是一个开源Go服务,可为正确的实体提供正确的体验并监视其影响。它提供功能标记,A/B测试和动态配置。它具有用于标志管理和标志评估的清晰的REST API。
我们可以利用flagr进行A/B测试和灰度发布,通过它完善产品。
flagr中的一些专业术语解释
- Flag. It can be a feature flag, an experiment, or a configuration.(它可以是功能标记,实验或配置。)
- Variant represents the possible variation of a flag. For example, control/treatment, green/yellow/red, etc.(变体表示标志的可能变体。 例如,控制/处理,绿色/黄色/红色等。)
- Variant Attachment represents the dynamic configuration of a variant. For example, if you have a variant for the green button, you can dynamically control what’s the hex color of green you want to use (e.g. {“hex_color”: “#42b983”}).(变体附件表示变体的动态配置。 例如,如果您有绿色按钮的变体,则可以动态控制要使用的绿色的十六进制颜色(例如{“ hex_color”:“#42b983”})。)
- Segment represents the segmentation, i.e. the set of audience we want to target. Segment is the smallest unit of a component we can analyze in Flagr Metrics.(细分表示分区,即我们要定位的受众群体。 细分是我们可以在Flagr指标中分析的组件的最小单位。)
- Constraint represents rules that we can use to define the audience of the segment. In other words, the audience in the segment is defined by a set of constraints. Specifically, in Flagr, the constraints are connected with AND in a segment.(约束表示可以用来定义细分受众群的规则。 换句话说,细分受众群是由一组约束定义的。 具体而言,在Flagr中,约束与细分中的AND连接。)
- Distribution represents the distribution of variants in a segment.(分布表示细分中变体的分布。)
- Entity represents the context of what we are going to assign the variant on. Usually, Flagr expects the context coming with the entity, so that one can define constraints based on the context of the entity.(实体表示我们要为其分配变量的上下文。 通常,Flagr期望上下文随实体一起提供,以便人们可以基于实体的上下文定义约束。)
- Rollout and deterministic random logic. The goal here is to ensure deterministic and persistent evaluation result for entities. Steps to evaluating a flag given an entity context:(推出和确定性随机逻辑。 此处的目的是确保对实体的确定性和持久性评估结果。 在给定实体上下文的情况下评估标志的步骤:)
- Take the unique ID from the entity, hash it using a hash function that has a uniform distribution (e.g. CRC32, MD5).(从实体中获取唯一ID,然后使用具有均匀分布的哈希函数(例如CRC32,MD5)对其进行哈希处理。)
- Take the hash value (base 10) and mod 1000. 1000 is the total number of buckets used in Flagr.(取哈希值(以10为底)和mod1000。1000是Flagr中使用的存储桶总数。)
- Consider the distribution. For example, 50/50 split for control and treatment means 0-499 for control and 500-999 for treatment.(考虑分布。 例如,控制和治疗的50/50分割意味着控制的0-499和治疗的500-999。)
- Consider the rollout percentage. For example, 10% rollout means only the first 10% of the control buckets (again, use the previous step example, 0-49 out of 0-499 will be rolled out to control experience).(考虑部署百分比。 例如,推出10%表示仅控制桶的前10%(同样,使用上一个步骤示例,将推出0-499中的0-49以控制体验)。)
flagr提供的http接口
几个专业术语的解释:
Flag:标志
Segment:
官方英文解释:Segment defines the audience of the flag, it’s the user segmentation.
中文翻译:分割区定义了标志的受众群体,即对用户细分。
Constraint:
官方英文解释:Constraint is the unit of defining a small subset of users.
中文翻译:约束是定义一小部分用户的单位。
Distribution:
官方英文解释:Distribution is the percent distribution of variants within that segment.
中文翻译:分布是该细分中变体的百分比分布。
Variant:
官方英文解释:Variants are the possible outcomes of flag evaluation.
中文翻译:变体是标志评估的可能结果。
Evaluation:
官方英文解释:Evaluation is the process of evaluating a flag given the entity context.
中文翻译:评估是在给定实体上下文的情况下评估标志的过程
Health:
官方英文解释:Check if Flagr is healthy.
中文翻译:检查Flagr是否健康。
Class | Method | HTTP | request | Description |
---|---|---|---|---|
Jsflagr.ConstraintApi | createConstraint | POST | /flags/{flagID}/segments/{segmentID}/constraints | 创建约束 |
Jsflagr.ConstraintApi | deleteConstraint | DELETE | /flags/{flagID}/segments/{segmentID}/constraints/{constraintID} | 删除约束 |
Jsflagr.ConstraintApi | findConstraints | GET | /flags/{flagID}/segments/{segmentID}/constraints | 查找约束 |
Jsflagr.ConstraintApi | putConstraint | PUT | /flags/{flagID}/segments/{segmentID}/constraints/{constraintID} | 更新约束 |
Jsflagr.DistributionApi | findDistributions | GET | /flags/{flagID}/segments/{segmentID}/distributions | 查找分布 |
Jsflagr.DistributionApi | putDistributions | PUT | /flags/{flagID}/segments/{segmentID}/distributions | 更新分布 |
Jsflagr.EvaluationApi | postEvaluation | POST | /evaluation | 更新某个评估 |
Jsflagr.EvaluationApi | postEvaluationBatch | POST | /evaluation/batch | 批量更新评估 |
Jsflagr.ExportApi | getExportSQLite | GET | /export/sqlite | 导出数据库转储的sqlite3格式,该格式是从主数据库转换而来的。 |
Jsflagr.FlagApi | createFlag | POST | /flags | 创建标志 |
Jsflagr.FlagApi | deleteFlag | DELETE | /flags/{flagID} | 删除标志 |
Jsflagr.FlagApi | findFlags | GET | /flags | 查找所有的标志 |
Jsflagr.FlagApi | getFlag | GET | /flags/{flagID} | 查找某个标志 |
Jsflagr.FlagApi | getFlagEntityTypes | GET | /flags/entity_types | 获取标志实体的类型 |
Jsflagr.FlagApi | getFlagSnapshots | GET | /flags/{flagID}/snapshots | 获取标志快照 |
Jsflagr.FlagApi | putFlag | PUT | /flags/{flagID} | 更新标志 |
Jsflagr.FlagApi | setFlagEnabled | PUT | /flags/{flagID}/enabled | 启用标志 |
Jsflagr.HealthApi | getHealth | GET | /health | 获取健康指标 |
Jsflagr.SegmentApi | createSegment | POST | /flags/{flagID}/segments | 创建分割区 |
Jsflagr.SegmentApi | deleteSegment | DELETE | /flags/{flagID}/segments/{segmentID} | 删除分割区 |
Jsflagr.SegmentApi | findSegments | GET | /flags/{flagID}/segments | 查找标志下的所有分割区 |
Jsflagr.SegmentApi | putSegment | PUT | /flags/{flagID}/segments/{segmentID} | 更新某个分割区 |
Jsflagr.SegmentApi | putSegmentsReorder | PUT | /flags/{flagID}/segments/reorder | 重新分配分割区 |
Jsflagr.VariantApi | createVariant | POST | /flags/{flagID}/variants | 创建变体 |
Jsflagr.VariantApi | deleteVariant | DELETE | /flags/{flagID}/variants/{variantID} | 删除变体 |
Jsflagr.VariantApi | findVariants | GET | /flags/{flagID}/variants | 查找标志下的变体 |
Jsflagr.VariantApi | putVariant | PUT | /flags/{flagID}/variants/{variantID} | 更新变体 |
具体的api文档可以参考以下地址:
https://checkr.github.io/flagr/api_docs/
flagr实例
假设我们想向美国用户推出一个新按钮,而我们不知道哪种颜色效果最好。 绿色/蓝色/粉红色是标志的三种变体。
我们可能希望将标志公开给一小部分用户,例如加利福尼亚的用户。 因此,加利福尼亚的用户属于细分区。
后来,我们了解到CA的用户喜欢绿色的按钮,NY的人们喜欢粉红色的按钮,DC的人们喜欢蓝色的按钮。因此,我们将分为三个部分,每个部分均由约束定义:州 ==?。该细分区也可以由多个约束定义。 例如,州== NY AND 年龄 >= 21
要对此标志进行A / B测试,我们可以尝试使用50% / 50%(分布)的绿色 / 蓝色,并仅对CA细分区域中20%(点击率)的用户进行测试。 稍后,我们可以将推广百分比设置为100%,以便CA中的每个用户都能以50%的机会获得绿色或蓝色。 当然,如果要向100%的用户推广到100%绿色,只需将分发设置为100% / 0%的绿色 / 蓝色和100%的推广百分比。
flagr的结构
flagr中包含三个组件,标志评估器,标志管理器和flagr指标。
- flagr评估器:评估传入的请求。
- flagr管理器:flagr管理器是 CRUD 的出入口。flagr的所有变化都在这里发生。
- flagr指标. Flagr指标是收集评估结果的数据管道。 目前Flagr仅支持Kafka作为管道。
- 本文作者: th3ee9ine
- 本文链接: https://www.blog.ajie39.top/2021/05/05/Flagr入门/
- 版权声明: 本博客所有文章除特别声明外,均采用 LICENSE 下的许可协议。转载请注明出处!