- 业界方案
- Nginx if指令
- 功能
- ngx_http_rewrite_module
- 简单业务分流
- 优点
- 不需要额外开发,性能方面也接近原生的Nginx框架
- 缺点
- 使用场景比较受限,if指令仅支持比较简单的condition类型
- 规则调整不支持动态化:调整策略,需要对Nginx进行reload,而reload操作会使Nginx的并发能力下降,业务高峰时甚至会导致请求504或502。
- 指令坑太多:if指令和set、rewrite指令等一起使用时,很多时候会出现不符合预期的行为,严重时甚至会导致段错误,最好的方法就是避免使用。
- ABTestingGateway
- 功能
- 数据存在redis中
- 使用lua-shared-dict、lua-resty-lock作为缓存
- 根据策略 iprange、uidrange、uidsuffix、uidappoint 进行匹配分流
ABTestingGateway灰度发布系统压测报告github.com
- 优点
- 策略调整动态生效:已有策略类型中的策略变更均可以通过HTTP API进行动态管理。
- 分流策略丰富:支持IP段、UID段等策略,也可以通过新增策略类型对策略库进行扩展。
- 缺点
- AB框架只支持4种策略类型,对于业务要根据请求Cookie、自定义header控制转发的情况,均需要开发新的策略类型和发布上线。
- 策略类型和业务场景紧密相关,导致AB系统的扩展性极差,很难快速支持新业务的路由需求。
- 美团方案
- Oceanus
- 功能
- 策略抽象:合理定义策略结构,适用尽可能多的业务场景。
- 策略的- 高效查询:接口粒度关联,应用维度管理。
- 运行时策略渲染:渲染策略模板,判断是否匹配策略,实现动态路由。
- 分组动态更新:分组数据增删改,均不需要reload
- 策略属性(字段)
- name:策略名,没有实际意义,可以根据业务场景进行定义。
- key:分流时依赖的关键字,比如要根据城市地域进行分发路由时,key就是regionid。
- passway:关键字在HTTP协议中的传输方式,可以是Parameter、Cookie、header、body中的一种。
- condition:表达式模板,支持四则运算/取模、关系运算符、逻辑运算符等。
- group:后端服务集群,即匹配策略后,转发请求的目标节点,一般是策略所属应用集群中的部分节点。
- category:策略类型,如果为1,表示某个服务的私有策略;如果为2,表示公共策略,主要用于策略数据管理。
- switch:策略开关,用于控制当前策略是在线还是离线。
- graylist:灰度列表,用于策略变更的线上灰度校验
Oceanus业务场景awps-assets.meituan.net
- Oceanus业务拓扑结构
优点
- 运行时获取Location path
- 异步更新机制
- 运行时策略渲染
- 分组动态更新
- 缺点
- 目前暂未开源
- 提供一种思路和方法