灰度发布系统考虑的因素

业务方面

目标用户选取策略

即选取哪些用户先行体验新版本,是强制升级还是让用户自主选择等。
可考虑的因素很多,包括但不限于:

  • 地理位置
  • 用户终端特性(如分辨率、性能)
  • 用户自身特点(性别、年龄、忠诚度等)

数据收集

在得到用户允许的前提下,收集用户的使用新版本应用的情况。如

  • 客户端性能
  • 客户端稳定性
  • 使用次数
  • 使用频率等

服务端数据反馈:

  • 新版本服务端性能
  • 服务端稳定性等

回滚策略

当新版本灰度发布表现不佳时,应回滚至旧版本。

对于纯粹的Web应用而言,回滚相对简单。
主要难点在于用户数据的无缝切换。

对于客户端应用,如果期待用户自行卸载新版本另行安装旧版本,成本和流失率都太高。
可以考虑通过快速另行发布新版本,利用升级来“回滚”,覆盖上次灰度发布的修改。
对于移动客户端,新版本发布成本较高,需要Appstore、Market审核。

技术方面

标识

用于区分用户,辅助数据统计,保证灰度发布过程中用户体验的连贯性(避免用户在新旧版本中跳变,匿名Web应用比较容易有这个问题)。
匿名Web应用可采用IP、Cookie等,需登录的应用可直接采用应用的帐号体系。
http请求传输过程中,会自动带上User-Agent,Host,Referer,Cookie等信息。

解决方案

基于Nginx

推荐用nginx+Lua+Redis。

架构图

架构图.png

流程图

流程图

部署架构图

部署架构图

基于Spring Cloud

基于Zuul,对用户进行鉴权;拦截请求,并重导向到另一个网址。
Zuul可以提供四种标准类型的过滤:

  1. Pre: 过滤规则在路由之前起作用。可以利用“Pre”过滤器实现用户鉴权,记录请求日志等。
  2. Routing:过滤规则在路由时发生作用。可以利用“Routing”过滤器实现动态路由、灰度发布、A/B测试、负载限流等。
  3. Post:过滤规则在路由之后发生作用。可以利用”Post”过滤器收集统计信息和指标,将微服务的相应写入Http响应并返回给服务消费者;
  4. Error:过滤规则路由过程中发生错误时发生作用。可以利用Error过滤器记录错误日志,并对错误进行二次处理等。
坚持原创技术分享,您的支持将鼓励我继续创作!