当前位置:首页 > 技术文章 > 正文内容

使用nginx split_clients实现A/B测试

arlanguage3个月前 (01-31)技术文章32

一、引言

A/B测试是微服务时代一个非常重要的能力,需求快速迭代上线和发布,必须具备对应的灰度测试的能力,对于上线的内容进行隔离验证,减少频繁变更带来的风险。本文介绍如何使用nginx 实现前端和后端服务A/B测试。

二、使用upstream实现A/B分流

upstream模块实现A/B分流适合后端部署在多个服务器上,有独立的IP和端口的场景,支持多种不同的分发方式,例如轮询、ip_hash、权重,,默认场景下是轮询,以下为使用ip_hash和权重的配置案例:

1、使用ip_hash的方式

upstream app{
 ? ?ip_hash;
 ? ?server 192.168.56.11:8080;
 ? ?server 192.168.56.12:8080;
}

2、使用权重的方式

upstream app{
 ? ?server 192.168.56.11:8080 weight=1;
 ? ?server 192.168.56.12:8080 weight=2;
}

使用upstream的方式配置非常简单,但是无法比较精确的控制分流的流量比例,只适合比较粗粒度的

三、使用split_clients实现客户端A/B分流


ngx_stream_split_clients_module是新版的nginx的内置模块,用于提供客户端的分流功能,默认情况下已经被编译进了nginx,如果想要禁用这个模块,可以通过在编译时添加
--without-http_split_clients_module参数,模块的语法为:

split_clients string $variable { ... } 

以下是配置案例:

split_clients "${remote_addr}AAA" $variant {
 ? ? ? ? ? ? ? 10.00% ? ? ? ? ? ? ? version1;
 ? ? ? ? ? ? ? 20.00% ? ? ? ? ? ? ? version2;
 ? ? ? ? ? ? ? * ? ? ? ? ? ? ? ?    version3;
}
server{
 ?location / {
 ? ?index ${variant}/index.html;;
  }
}

原理是使用 MurmurHash2 对原始字符串的值进行哈希处理 ,按照配置的比例为variant变量赋值,如上配置所示,部署三个不同的版本,version1分配10%的流量,version2分配20%的流量,*代表100%-10%-20%=70%的流量,如上例所示,在根目录下创建version1、version2、version3三个目录,分别部署不同版本的前端资源,通过location配置不同的的variant值访问不同目录下的index.html,从而达到对于前端应用按照不同的分流比例进行分流访问的目的。

四、使用split_clients实现后端应用A/B分流

以上的示例是实现客户端应用的A/B分流,后端应用同样也需要有A/B测试的能力,一般有两种情况:

1、使用proxy_pass转发到不同的上下文

split_clients "${remote_addr}AAA" $variant {
               10.00%               version1;
               20.00%               version2;
               *                  	     version3;
}

location /test {
        	proxy_pass http://192.168.56.12:8080/${variant};
        }

2、通过请求头参数,利用API网关等解析参数进行分流

对于不能直接通过proxy_pass转发到不同的上下文的情况,可以通过proxy_set_header将分流后不同的流量带上不同的参数,此参数透传到后端服务,后端服务部署API网关,在API网关上解析对应的参数进行分流,如下所示,将variant变量设置到REQUEST-TYPE中。

split_clients "${remote_addr}AAA" $variant {
               10.00%               version1;
               20.00%               version2;
               *                  	     version3;
}
location /test {
            proxy_set_header REQUEST-TYPE $variant
            proxy_pass http://192.168.56.12:8080;
        }

使用
ngx_stream_split_clients_module实现A/B分流特别适合后端应用只有一个统一入口的 情况,例如统一的域名访问,这个方案能够比较精细的控制分流的流量比例,搭配API网关等服务可以实现灵活的控制,是比较建议的方案。



扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1369.html

分享给朋友:

“使用nginx split_clients实现A/B测试” 的相关文章

linux(centos)yum安装nginx最新版及配置文件

安装nginx及配置文件我们采用yum的方式安装最新版nginx,就两步即可。最新版本及其他Linux版本可见官方文档官方文档:http://nginx.org/en/linux_packages.html#stable请读者根据自己的版本选择配置:按官方文档,选择自己版本centos可看到步骤:1...

PHP nginx配置 配置nginx支持php

在配置 PHP 和 nginx 以运行 PHP 应用程序时,您需要进行以下步骤:安装 nginx 和 PHP:如果您的系统上尚未安装 nginx 和 PHP,请根据您的操作系统的说明来安装它们。配置 nginx:您需要为 PHP 应用程序创建 nginx 服务器配置。您可以使用以下代码作为模板:ph...

nginx代理常用配置

1. 最简反向代理配置在http节点下,使用upstream配置服务地址,使用server的location配置代理映射。upstream my_server { server 10.0.0.2:8080; keepalive 2000;}server { listen 80; server_...

PHP日志记录

背景在生产环境中日志的重要性显而易见,能快速定位问题和程序的调优。在LNMP架构中怎么记录好程序中的错误日志。设置error_log记录PHP日志信息#将会向PHP报告发生的每个错误 error_reporting = E_ALL #关闭页面显示才能将错误回写到日志文件 display_err...

宝塔面板通过可视化界面来管理云服务器的运维软件

宝塔面板是专门给广大普通用户通过可视化界面来管理你的云服务器(Linux或者Window系统),节省操作服务器的时间和精力成本,可以一键安装和搭建网站,可以一键安装PHP运行环境,一键安装java运行环境,一键安装各种开发环境.普通人用的最多的就是搭建和部署网站.例如:宝塔面板是一款服务器管理软件,...

Nginx核心指令if和set入门

下述介绍的指令均在nginx.conf配置文件中设置,该配置文件的整体结构见:Nginx中nginx.conf配置文件详解1.if指令(1)含义nginx用于条件判断(2)作用域在server、location块中设置,并起作用(3)设置方法1)运算符:=、!=,用来与字符串和变量进行比较判断是否相...