`
QING____
  • 浏览: 2253442 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx实现简单的A-B测试(灰度发布)

 
阅读更多

    灰度发布,现在是很多大项目的一个标配运维特性,我们可以将一个“新的版本代码”发布到集群中的少数几台(组)机器上,以便引入线上少量真实用户进行测试,用于验证产品改进的收益、小规模试错等。nginx提供了“nginx_http_split_clients_module”、“nginx_stream_split_clients_module”,分别适用于http和tcp,可以帮助我们简单实现这些功能,不过如果你需要高度自动化、自主化的特性,或许需要进行一定的扩展和改造。

 

    split模块在0.8版本就已经有了,使用起来也非常简单:

split_clients string $variable {....}

 

    此指令的上下文为http。

    1、假如,我们的web项目中提供了2个html页面,其中index_new.html为最新发布页面,index.html为旧页面,为了“避免新页面有BUG,而影响全站用户”、“测试新页面上体验改进是否符合预期”,我们将index页面的访问流量中的10%转发到新页面上,剩余90%继续使用旧页面。

split_clients "${remote_addr}_1qazxsw2" $variant {
               10%               _new;
               *                  "";
}

server {
    ...
    location / {
        index index${variant}.html;
}

 

    2、假如,我们的web项目中发布了新的功能,为了避免程序BUG导致大规模异常,减少影响面,我们也可以使用spit做“切流量上线”;首先我们需要将线上的机器分为多个group,每个group中可以包含一定数量的server,简单而言,就是一个group就是一个upstream;比如我们30台机器,我们想切10%的流量发布新版本,那么就将3台机器组成一个“灰度组”来发布新程序,其他机器继续运行旧的web程序;当灰度组经过多日的观察,确实没有太大问题,我们则可以取消灰度组,全量上线发布。

split_clients "${remote_addr}_1qazxsw2" $group {
               10%               gray_group;
               *                  main_group;
}
upstream gray_group {
    server 10.0.1.11;
    ...
}
upstream main_group {
    ....
}

server {
    ...
    location / {
        proxy_pass http://${group};
}

 

    上述配置文件中,我们可以看到split模块的使用方式,“split_clients”指令接受2个参数,nginx将会根据第一个参数的值使用MurmurHash2算法计算hashcode,hashcode值域为0~4294967295(即2<<31 -  1),通常第一个参数是一个动态值,比如用户的ip、session_id等。10%是表示一个区域,如果第一个参数的hashcode值,在0 ~ 4294967295 *10%之间,则将“_new”赋值给$variant;20%表示第一个参数的hashcode值,在4294967295 * (10% ~ 20%)区间时....依次轮推,"*"表示上述区间都没有覆盖的值域,将使用的值。

 

    我们发现这种方式的灰度发布,其实流量导入的比例并非严格。如果你的服务多次灰度发布,可能会导致某些IP总是在灰度区域,有时候我们需要调整spit第一个参数的随机数因子,本例中"${remote_addr}_1qazxsw2",“_1qazxsw2”这个补充字符串就是随机因子,每次灰度发布,我们需要修改这个值以避免上一次灰度的IP再次进入灰度,当然这个操作也是没有太大必要。

 

    通常我们还有一些更加苛刻的要求,比如强制要求某个IP、用户ID进入灰度区域。那么使用spit模块就显得有些不太适应,要么使用nginx的geo组件将相应的IP、uid添加到geo文件中(还需要后端程序在cookie输入相应的uid值,以便nginx获取和判断)。对于这种有很多“个性化”条件的,我们可以使用nginx + lua + redis (memcached)实现,其中lua作为脚本语言来做条件判断工具以及使用redis客户端操作数据,redis用于存储需要灰度的用户信息,此外可能还需要开发一个后端程序来运营redis中的数据,比如将某个uid加入redis,lua从cookie中读取uid并检查redis中是否存在,如果存在则进入灰度区域。

 

分享到:
评论

相关推荐

    基于 Nginx 的 Java Web 项目灰度发布框架.zip

    在IT行业中,灰度发布(也称为A/B测试或蓝绿部署)是一种常见的软件发布策略,它允许开发者在正式发布新版本之前,在一部分用户中进行小规模的测试,以评估新功能的效果、性能和稳定性。在这个场景中,我们讨论的是...

    使用Nginx实现灰度发布的使用

    灰度发布在实践中通常伴随着A/B测试,这是一种对比不同版本服务效果的方法。通过对用户群体进行分组,我们可以比较不同版本的性能、用户体验和业务指标,从而做出最佳决策。 总结来说,Nginx提供了灵活的灰度发布...

    服务灰度发布方案.docx

    AB test 就是一种灰度发布方式,让一部分用户继续用 A,一部分用户开始用 B,如果用户对 B 没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到 B 上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就...

    自动化渐进式交付实践.pdf

    1. **Kong、Envoy、Zuul、Nginx**:这些网关服务可以用于在流量分发层面实现A/B测试和灰度发布。 2. **业务逻辑层实现**:在应用程序内部实现A/B测试和灰度逻辑,对不同用户群体提供不同版本的服务。 **五、自动化...

    gate_config.zip

    总的来说,"gate_config.zip"中的配置文件是实现基于ABtesting的灰度发布策略的关键。正确理解和使用这些配置,可以帮助我们在动态发布中更有效地测试和验证新功能,同时确保系统的稳定性和用户体验。在实际操作中,...

    微博服务化的新姿势--service mesh实践

    - **核心功能**: 包括服务发现、健康检查、负载均衡、熔断、限流、重试、双发、访问控制、应用性能管理(APM)、日志记录、监控、指标收集、报警、流量调配、动态路由、灰度发布、A/B 测试、弹性扩展及故障注入等。...

    饿了么多活IT架构介绍.pptx

    9. **灰度发布与A/B测试**: 灰度发布允许新版本服务在一部分用户中先行测试,逐步扩大范围,以减少新功能对整体系统的影响。A/B测试则有助于优化用户体验,根据用户反馈调整策略。 10. **数据一致性与事务处理**...

    后端架构师技术图谱.docx

    - 运维技术包括常规监控、APM(应用性能监控)、统计分析、持续集成(CI/CD,如Jenkins)、环境隔离、自动化运维工具(Ansible、puppet、chef)以及测试理论(TDD、单元测试、压力测试、全链路压测、A/B测试、灰度、...

    虎扑网架构升级之路.zip

    同时,利用A/B测试和灰度发布策略,可以在不中断服务的情况下逐步验证新架构的效果。 然后,运维自动化与监控体系。在升级过程中,持续集成/持续部署(CI/CD)工具如Jenkins能自动化构建和部署流程,减少人为错误。...

    亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统

    书中可能还会涉及其他关键知识点,如CDN(Content Delivery Network)用于加速静态资源的分发,Kubernetes等容器编排工具用于自动化部署和管理,以及A/B测试、灰度发布等方法来逐步验证和上线新功能,降低风险。...

    miaosha

    3. **A/B测试**:对不同策略进行对比测试,选择最优方案。 总结,构建秒杀系统模型需要考虑多方面的技术,包括系统架构、并发控制、数据库优化、接口设计、监控报警以及测试优化。在Java环境下,合理运用这些技术和...

Global site tag (gtag.js) - Google Analytics