ABTest介绍及abtest流量切换实现
本文为学习abtest切流方案方便以后查看大部分内容转载自原文 https://blog.csdn.net/tanweii163/article/details/80543083
互联网公司的业务发展过程中,当业务发展到一定阶段后,野蛮生长的红利逐渐消退,用户增长空间在可见策略下变得不那么明显的情况下,如何合理地规划产品迭代策略就显得尤为重要了,而具体如何判断产品策略是否有效,往往就需要数据进行判断,其结果决定了该产品或策略的生命力以及与之配套的各类资源的调配,毕竟大部分公司是不会愿意将资源浪费在无效的产品和策略上的。那么,通过什么样的工具或手段才能确保数据驱动策略的有效落地和实施呢?
目前支付宝通过ABTest及建设与之相适配的实验基础设施平台来实现这样的目标。作为比较前沿的一种思路与实践,虽然目前在国内的普及程度还并不是很高,但是随着国内互联网ToC流量红利的消退,这种工具会被越来越多的公司重视起来。
ABTest的目标&背景
在现实的产品设计场景中,我们经常会遇到多个设计方案的选择。例如,App或网页端某个页面的某个按钮的颜色是用蓝色还是红色,是放在左边还是右边?传统的解决方案通常是集体表决或由某位Leader拍板,类似的选择还有很多,从概率上很难保证传统的选择策略每次都是有效的,而ABTest显然是一种更加科学的方法。
ABTest,简单来说,就是为同一个产品目标制定两个方案(比如两个页面一个用红色的按钮、另一个用蓝色的按钮),让一部分用户使用A方案,另一部分用户使用B方案,然后通过日志记录用户的使用情况,并通过结构化的日志数据分析相关指标,如点击率、转化率等,从而得出那个方案更符合预期设计目标,并最终将全部流量切换至符合目标的方案。
ABTest的最终目标就是通过较少量用户体验来发布某些应用新功能。
实现思路
  abtest对于业务开发来说,最好是独立的,也就是我们需要在业务开发之外实现,无感知切入abtest,同时注意保持业务一致性,例如在某一时期,a用户始终看到A版,B用户始终看到B版。最终我们选用nginx+lua方案,通过在nginx中执行嵌入的lua脚本,动态计算upstream,将不同的用户导向不同的程序版本,达到abtest的目的。
  
具体实现
我们通过提取某一个特征cookie标识用户,该cookie在一定周期内针对同一个用户不是随意改变的。假如存在这个cookie,名称为__abc=testuser.123123,如果cookie值为数值化,可以直接进行模运算取余,如果是字符型,先进行一个hash运算得到数值,再进行模运算取余。
如果业务系统不存在特征cookie,条件允许可以在网站域下种一个新的cookie。
  数据流示意图如下: 
用户b的cookie特征提取为001,跟配置的分流比例300比较,符合条件,将upstream改为b.domain.com, 用户b一直访问新版本程序。
nginx安装lua模块
lua-nginx-module官方文档 ,请参考https://github.com/openresty/lua-nginx-module#installation,也可以直接安装openresty。
nginx conf配置
  
初始化脚本
  
  定时任务脚本



分流计算脚本
 
最后我们简单做个操作界面,用于动态改变redis中的值

点击切换开关,改写流量切换比例
其他
如果cookie是字符串,可以先进行hash运算,下面是一个基于ffi的hash实现可以参考下,文件名是murmurhash2.lua
  
ABTest介绍及abtest流量切换实现的更多相关文章
- motan源码分析十:流量切换
		motan提供了流量切换的功能,可以实现把一个group的流量切换到另一个group(一个或多个服务都可以).大家可以使用tomcat部署motan的管理工具,并设置几个组,例如可以参考demo代码: ... 
- 最近学到的ABTest知识
		前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 如果之前看过我文章的同学就知道我在工作中搞的是推送系 ... 
- 携程机票的ABTest实践
		携程ABTest伴随UBT(User Behavior Tracking System)系统一起,两年多的时间,从最初online寥寥几个实验,到现在单是机票BU每周就有数十个app/online/h ... 
- DNS介绍
		DNS出现及演化 网络出现的早期 是使用IP地址通讯的,那时就几台主机通讯.但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和w ... 
- idou老师教你学Istio06: 如何用istio实现流量迁移
		流量迁移是流量管理的一个重要功能.istio提供的流量管理功能将流量从基础设施扩展中解耦,支持动态请求路由,故障注入.超时重试.熔断和流量迁移等.流量迁移的主要目的是将流量从微服务的某一版本的逐步迁移 ... 
- Jenkins常用插件介绍
		摘要: 对于中小型运维团队,jenkins作为运维利器,可以解决很多工作中的痛点.基于UI的特性从而让使用者的入门成本很低,基于插件可以具备认证,记录,条件触发以及联动,让运维工程师可以将精力放在业务 ... 
- Alertmanager 概念与配置深入介绍
		文章转载自:https://www.cnblogs.com/gered/p/13496950.html 警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的. 报 ... 
- [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板
		引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate) 切换模板的两种方式: 使用DataTemplateSelecto ... 
- 云计算之路-阿里云上:10:28-10:51云盾清洗以及IP切换引发的主站访问故障
		大家好,非常抱歉!今天10:28-10:51期间由于阿里云云盾流量清洗,以及切换IP后负载均衡的带宽跑满,影响了主站的正常访问,给您造成了很大的麻烦,请您谅解! 故障的过程是这样的: 10:28,我们 ... 
随机推荐
- tensorflow|tf.train.slice_input_producer|tf.train.Coordinator|tf.train.start_queue_runners
			#### ''' tf.train.slice_input_producer :定义样本放入文件名队列的方式[迭代次数,是否乱序],但此时文件名队列还没有真正写入数据 slice_input_prod ... 
- .eslintrc.js相关配置
			module.exports = { root: true, //此项是用来指定javaScript语言类型和风格,sourceType用来指定js导入的方式,默认是script,此处设置为modul ... 
- 一、python基础之字符串的处理
			最近开始重新回过头来巩固一下python的基础知识,并在此做一些记录以便未来更好的回顾 一.字符串的大小写转换 title() 使用title()方法可以将字符串中每个单词的首字母大写 name = ... 
- FZU 2060 The Sum of Sub-matrices(状态压缩DP)
			The Sum of Sub-matrices Description Seen draw a big 3*n matrix , whose entries Ai,j are all integer ... 
- GitHub托管代码-学习笔记
			1.注册github账号 https://github.com/ 2.下载GitHub Desktop软件 https://desktop.github.com/ 在下载的软件上登陆GitHub账户 ... 
- 【记录】Mybatis-Generator 数据层代码生成器,自动生成dao类,mapper,pojo类
			Mybatis-Generator 工具来帮我们自动创建pojo类.mapper文件以及dao类并且会帮我们配置好它们的依赖关系. 官方文档地址:http://mybatis.org/generato ... 
- 【记录】Redis 基础
			Redis可以存放五种类型 1:String(字符串) 2:List(列表) 3:Hash(字典) 4:Set(集合) 5:ZSet(有序集合) String (字符串) redis 127.0.0. ... 
- 三、bootstrap-treeview
			一.bootstrap-treeview 修饰标签为徽章 参考 https://www.cnblogs.com/bin521/p/8403588.html 
- 力扣 —— Two Sum ( 两数之和)  python实现
			题目描述: 中文: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ... 
- 11G利用隐含参数,修改用户名
			步骤概述: 1. 停库,修改隐含参数_enable_rename_user 为true 2. 以 restrict方式启动数据库 3. alter user aaaa rename to ... 
