之前介绍过Nginx通过cookie做灰度发布,通过判断cookie,将不同的请求根据需求分流到不同的后端,如图
上面的方法是通过判断cookie来进行分流的,其实在Nginx中专门有个模块是做客户端分流的——split_clients
在nginx官网文档中,定义split_clients是可以用来构建适用于A/B测试的变量
它这句话,如果你没使用split_clients的话,比较难理解,其实它就是定义了一组变量,通过使用变量来进行分流
如果你读了上面通过cookie做灰度发布的话,里面有关于nginx中map的介绍,你会发现split_clients和map定义变量是一样的,只不过,它这里还有一个hash算法的配置比例
split_clients是通过MurmurHash2算法对原始字符串进行哈希处理,源码在http/modules/ngx_http_split_clients_module.c
MurmurHash算法在core/ngx_murmurhash.c
就这么一段,murmurhash是一种非加密型哈希函数,由Austin Appleby于08年发明,现在最新版本为murmurhash3,性能是md5的4倍左右,在redis中应用广泛,包括数据库、集群、哈希键、阻塞操作 等功能都有用到这个算法
在nginx中, split_clients执行过程如下:
各个百分比相加不能超过100%,* 表示匹配剩余的百分比,百分比可以为小数点后两位的小数
以上就是split_clients的执行过程,因为split_clients可以构造新的变量,通过这个特性,我们可以把该变量作为内部自定义变量用在很多地方,比如上图中,将该变量用在upstream的命名中,这个时候,我们就可以通过remote_ip、cookie_hash、url_hash等你需要的变量来进行分流,让不同的客户端,访问到对应的upstream上游服务器,配置示例如下:
类似的,还可以在fastcgi代理的时候,设置不同的fpm后端,另外可以在配置代理缓存、临时文件缓存时将不同的缓存分别存储到不同的位置等
split_client使用比较灵活,例如可以在并发活动中,通过以上方式限流、分流等。