拆分客户端#

该模块用于 A/B 测试、金丝雀发布或其他需要将一定比例的客户端路由到一个服务器或配置的场景,同时将剩余部分引导到其他地方。

配置示例#

stream {
    # ...
    split_clients "${remote_addr}AAA" $upstream {
                  0.5%                feature_test1;
                  2.0%                feature_test2;
                  *                   production;
    }

    server {
        # ...
        proxy_pass $upstream;
    }
}

指令#

split_clients#

Syntax

split_clients string $variable { ... }

默认值

Context

stream

通过对 string 进行哈希来创建一个 $variablestring 中的变量被替换, 结果被哈希, 然后哈希被映射到 $variable 的字符串值。

哈希函数使用 MurmurHash2 (32 位), 其整个值范围 (0 到 4294967295) 按出现顺序映射到桶; 百分比决定了桶的大小。 通配符 (*) 可以出现在最后; 落在其他桶外的哈希被映射到其分配的值。

示例:

split_clients "${remote_addr}AAA" $variant {
               0.5%               .one;
               2.0%               .two;
               *                  "";
}

这里,插值后的 $remote_addrAAA 字符串的哈希值分布如下:

  • 值为 0 到 21474835(0.5% 的样本)产生 .one

  • 值为 21474836 到 107374180(2% 的样本)产生 .two

  • 值为 107374181 到 4294967295(所有其他值)产生 "" (一个空字符串)