PHP经验分享Api设计Nginx高端成长之路

【充电】《Nginx核心知识100讲》为复杂业务生成新的变量ma

2019-01-16  本文已影响19人  言十年

极客专栏《Nginx核心知识100讲》77~78小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。

77 | 为复杂的业务生成新的变量:map模块

很多时候我们直接使用某些变量的值做逻辑判断去实现功能是比较困难的,有一个模块提供了可能性,它可以根据一个变量或多个变量组合成的值结果做判断,再修改新的变量的值,通过我们判断新变量的值来实现非常复杂的业务逻辑。

image.png

指令

image.png

为了提升性能同样把map后的参数放到了hash表中,这个hash表可以通过map_hash_bucket_size 和map_hash_max_size控制。

image.png

hostnames 指令的匹配遵循的规则跟 和我们server_name中介绍的正则表达式,泛域名等是一致的。

示例

image.png

演示下上面左边的四个小例子。

image.png

泛域名优先于正则表达式,泛域名中前缀优先于后缀。所以下面返回的是2:0

image.png image.png

实际上有多个匹配上了,但是字符串完全匹配的方式优先级最高,所以下面返回3:0

image.png

http 的map模块为变量的使用,提升了很多的可能性。但是理解它有点困难,可以仿照switch case这样的语法去理解它,在加入hostnames 匹配规则,对照sever_name或者location等,因为nginx对所有的涉及到泛域名,正则表达式以及字符串的严格匹配时,它们遵循的规则是一致的,这方便我们掌握和理解这个模块的用法。

留言问题

  1. 类比为编程语言的 switch case就很好理解了 👍🏻

 作者回复
:-)

78 | 通过变量指定少量用户实现AB测试:split_client模块

与map模块有些相似,也是通过生成新的变量完成AB测试功能的 split_client模块,这个模块可以根据变量的值按照百分比的方式生成新的变量。

模块介绍

image.png

什么是AB测试呢?我们的产品推出的功能不太确定用户是否接受,所以我们推出了多个版本功能,让某一个百分比的用户尝试某一类功能,最后看大家的反馈, 最终使用哪一个功能的版本。

关键点,我们要确保按照某一定的百分比去决定用户的行为。所以split_client模块就是根据某类变量的值按百分比生成新变量值。

基于什么判断百分比呢?根据已有变量。

指令

跟map有些相似。

image.png

如果比分比超过 100 ,nginx无法重启

image.png image.png

下图 中的 http_testcli 从http头部取。

image.png image.png image.png

我们可以通过后缀名访问不同的文件 ,当然也可以使用if指令做不同的行为调度。

使用这个模块需要我们对Mur2Mur2hash2算法的实现有所了解。针对AB测试这样的场景,split_clients是一个非常有效的手段。

留言问题

1.split_clients适用于通过百分比来简单划出一部分用户 . 不是固定的有标识的一批用户对吗

 作者回复
是的

2.我们在业务中用到A/B测试中常用枚举值来区分不同用户bucket,比如用A,B,C,D来标记不同的用户分组。split_clients用到了hash算法,这样原始枚举值和hash结果之间就没有直观关系,请问,我们用split_clients模块的时候该如何确保选定的原始flag值和hash结果能满足预设的映射关系呢?

 作者回复
你是说,在请求中的header或者url里,已经有值来确定,当前用户的请求路由到某上游集群?
如果是这样,那么split_clients就不能用了,你可以使用map模块,通过arg_或者http_、cookie_等变量取出你说的枚举值,再选定路由。
split_clients适用于通过百分比来简单划出一部分用户,作AB测试。

上一篇下一篇

猜你喜欢

热点阅读