IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Nginx+KV db进行AB灰度测试

MySQLOPS 数据库与运维自动化技术分享 2012-07-12 23:26:36 累计浏览 2,589 次
本机暂存

周6参加华东运维大会,听了人家淘宝用nginx的一些场景,其中AB的灰度测试可能适用场景会比较普遍,当然大会上,并没有详细讨论实现。

大概需求是: 网站类业务在更新new feature时,并不想让全量用户看到,可以针对地区性用户开放此feature

大概构思了一个方式,使用 nginx+redis/memcache+IP库实现,简单的流程图如下:

原图已失效

当然其中的new feature server和normal server不必要一定得是物理上的服务器,可以是任意逻辑上分开的服务和http URI

所用的模块是 ngx-lua-module, 以及一个基于ngx-lua写的lib:  lua-resty-memcached或lua-resty-redis, 这里假设使用memcached作为ip数据的存储,cache内保存以ip作为key,以true(1)或false(0)作为value的数据,nginx在请求到来时,从cache内以remote_addr(如果是用XFF头,则对XFF做一次处理后获取到real ip)作为key从cache内做一次get,判断此req应该的转发;

这里有一个问题是:cache内是保存具体的IP形式的方式,还是以CIDR的超网形势存储,若直接使用IP作为key,数据量不容小视,而且IP信息的准确度得有一定的保证才行;若使用CIDR的方式,则在nginx端又会增加一次IP转换CIDR以及对get到的CIDR做比较(具体实现方法还没想到), 复杂度会有所增加,个人偏向直接使用IP作为key,只要保证了IP的一定准确性,数据大小问题不大,现在遍地都是32G,64G内存的缓存。

若使用ip作为key,一个折中的办法是每次进行ABtest的时候,flush缓存,只保存指定地区的ip数据即可,ngx在做get的时候,如果没有返回,则认为此req是到normal server的.

管理平台方面,只需要做个简单的批量set缓存的功能就可以了,至于UI么,就看你给谁用了,自己用嘛,UI丑陋点就丑陋点了 :)

性能和可用性方面:

增加了一次缓存的连接和get操作,理论上此开销应该是很小的,ngx-lua实现的lua-resty-memcached有不少人做过测试,性能非常可观.

可用性方面会增加一个当缓存断线的风险点,通过settimeout,将缓存超时限制到一个较小的时间,影响较小,另外ABtest的方案也不应该常年累月的在线上,只有在有需求时,才需要这套系统吧,因此可用性方面对全局影响应该是较小的,相比新的feature上线时影响全部用户的风险,这个冒险还是值得的。

上述暂时只是个人的思路,而且也还没上线使用,实现方面只完成了nginx获取key来判断req转发的验证,针对此方式也未做过详细压力测试,抛砖引玉,有好的方式欢迎讨论.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,167)
  2. 搜狐闪电邮箱的 Nginx/Postfix 使用模式 (累计阅读 33,898)
  3. redis源代码分析 - persistence (累计阅读 32,229)
  4. 记录一个软中断问题 (累计阅读 16,957)
  5. 解析nginx负载均衡 (累计阅读 16,626)
  6. Redis消息队列的若干实现方式 (累计阅读 12,088)
  7. server日志的路径分析 (累计阅读 11,241)
  8. Nginx模块开发入门 (累计阅读 11,173)
  9. 检查nginx配置,重载配置以及重启的方法 (累计阅读 10,897)
  10. Cacti 添加 Nginx 监控 (累计阅读 10,647)