Twitter有一个对外开放的JS组件,widgets.js,其他站长可以把这个js嵌入到自己的网页中,就可以有Twitter的一些功能(类似新浪微博开放的JS组件)
为了让站长简单方便的集成,所有功能都在这一个js文件中,引用时也不需要版本号
widgets.js 的访问量巨大,每秒30万次
所以,这个js的更新部署是个比较麻烦的任务,如何安全的部署新版,出现问题时把影响范围尽量降低?Twitter特别对这个js的部署流程进行了优化
‘回退第一,改错第二’是Twitter的重要理念,回退必须快速、简单
任何代码都可能有bug,所以要分阶段逐渐发布,尽早发现问题,尽快回退
需要实时看到部署过程的状态,例如浏览器类型、国家地区、新旧版本的当前比例
部署过程使用 DNS 来控制,通过规则的配置,决定当前这个请求使用新版本还是旧版本
共有3个部分:
每当有请求来到 platform.twitter.com 时,会根据这个请求的地理位置区域来决定解析到哪个IP(IP1 是旧版,IP2 是新版)
例如以地区A作为试点儿,具体规则如下:
第1阶段:来自地区A的 5% 流量会被解析到 IP2,其他的所有流量都进入 IP1
第2阶段:所有来自地区A的流量都解析到 IP2,其他进入 IP1
第3阶段:所有流量都解析到 IP2
IP1 的请求会从源1获取 widgets.js,IP2 的请求会从源2获取
是上传 widgets.js 的地方,CDN 会从 Origin 获取最新的 widgets.js
Origin 1 上是旧版,Origin 2 上是新版,流量被逐渐转移到 Origin 2,当部署完全成功后,widgets.js 会被拷贝到 Origin 1,然后把所有流量都转到 Origin 1
部署过程中发现问题的话,立即把所有流量转到 Origin 1,实现快速回退
widgets.js 在客户端执行时会返回日志信息,服务端就可以实时构建出统计图表
一个成功的部署过程如下图
白色线是使用新版的数量,灰色线是旧版数量,整个过程是新版部署比例逐渐提高,旧版反比例变化
这个部署流程已经运行了1年,非常高效,新版有bug时可以把影响降到最低,也可以看出影响的范围
这套思路很值得学习,高效可靠的部署流程会直接影响产品的发展速度,好的部署流程会使产品升级更加放心,也就更加敢于进行创新尝试