在软件上线以前,不可避免地要对软件的正确性、可靠性进行测试,又最好不要停机维护、不要影响用户体验,而且在新版本出现问题的时候可以及时回退。因此,须要有一套完整的部署方案,灰度发布、滚动发布、蓝绿部署都是常见的手段,而A/B测试则是对用户体验进行调查的测试手段,这里一并学习。html
灰度发布又叫作金丝雀发布,之前矿工下矿洞前,会放一只金丝雀去试探是否有瓦斯(金丝雀对瓦斯很敏感),映射到这里就是先发布一小部分来试探总体是否可以正常运行,若是能正常运行则进行彻底部署的发布方式,目前仍然是很多成长型技术组织的主流发布方式。数据库
(1)当前版本为V1,替换服务器集群中的一小部分(好比1台)为新版本V2。服务器
(2)若是正常运行,则把剩余V1版本所有升级为V2;若是运行失败,全部服务器回退到V1。架构
(1)流量趋势图负载均衡
绿色为旧流量,黄色为新流量。微服务
(2)优势工具
用户体验影响小,发布过程当中出现问题只影响一部分用户。学习
可以动态指定新版本流量测试
(3)缺点spa
自动化程度不够,发布期间可能会引起服务中断。
滚动发布(Rolling Update Deployment)是在灰度发布上的改进,先发布一小部分,而后逐步增长新版本的数量,直到服务器都升级为新版本。自动化程度较高,用户体验平滑,是目前成熟型技术组织所采用的主流发布方式。
(1)先发布小比例新版本,相似金丝雀。
(2)若是验证成功,按照必定比例替换新版本,直到全部版本都升级为新版本,例如1台,10%,50%,100%。
(3)一旦失败,将全部新版本应用替换回旧版本应用。
(1)流量趋势图
绿色为旧流量,黄色为新流量。
(2)优势
用户体验影响小,体验平滑。
(3)缺点
发布和回退时间缓慢。
发布工具复杂,NLB须要平滑的流量摘除和拉入能力。
没法动态控制流量
蓝绿部署(Blue Green Deployment)是一种能够保证系统在不间断提供服务的状况下上线的部署方式,它以可预测的方式发布应用,减小发布过程当中服务中止的时间。
(1)准备两个相同的应用运行环境,命名为蓝色环境、绿色环境,刚开始,蓝色环境和绿色环境都运行着相同的应用版本V1,只有蓝色环境对外提供服务。
(2)咱们开发了一个新版本V2,那么放到绿色环境上进行反复的测试、修改、验证,肯定达到上线标准后,利用负载均衡器/反向代理/路由等手段将对外服务切换为绿色环境。
(3)一段时间后,若是发生故障,那么迅速切换回蓝色环境V1;若是运行没有异常,那么蓝色环境更新版本到V2,版本再次一致。
(4)当须要开发下一个版本V3,重复前面的步骤,蓝色绿色相互切换相互备份。
(1)流量趋势图
绿色为旧流量,黄色为新流量。
(2)特色
蓝色绿色环境相同,但硬件能够不一样,例如蓝色和绿色环境分别是两台独立的机器。
蓝色绿色环境都会在上线版本、旧版本(用于回滚)和新版本(用于上线前测试)之间循环。
如何保证数据库的事务在切换、回退过程当中不受影响是很重要的事情,通常来讲能够在切换过程当中设置为“只读”,或者设计回馈机制,将事务同时反馈到两个环境。
(3)优势
不停机更新。
遇到问题能及时回退到正确版本。
(4)缺点
须要的硬件成本和软件服务倍增了。
数据库同步很是困难。
若是须要同时处理“微服务架构应用”和“传统架构应用”,当协调很差的时候仍是可能出现服务中止的。
在非隔离基础架构(VM、Docker)上执行蓝绿部署,蓝绿色环境都有被摧毁的可能。
蓝绿发布就是双服务器发布中的蛮力发布法(强行切换),而利用相同的双服务器发布模式能够进行灰度、滚动发布。
前面的全部都是发布方法,旨在发现bug、隐患。
测试方法则是效果测试,关注的是旧版本和新版本的效果好坏,好比流量转化率、用户体验等等。
A/B测试指的是同时上线V1和V2版本,根据必定条件将流量分别导入V1和V2版本,收集感兴趣的数据,来对比产品功能的效果。
影子测试主要用于语言切换,好比从JAVA项目迁移到.NET项目,准备两个彻底相同的环境,将流量同时导入两个环境,比对输出的响应,来判断是否逻辑等价。
这种测试可能须要几周,也可能长达半年。
部署方式 | 零停机 | 生产流量测试 | 机器成本 | 回退速度 | 对用户的影响 | 复杂度 |
---|---|---|---|---|---|---|
灰度发布 | ? | √ | 低 | 慢 | 通常 | 低 |
滚动发布 | √ | √ | 低 | 慢 | 低 | 低 |
双服务器组——蓝绿 | √ | × | 高 | 快 | 通常 | 通常 |
双服务器组——灰度 | √ | √ | 高 | 快 | 小 | 通常 |
双服务器组——滚动 | √ | √ | 高 | 快 | 小 | 通常 |
二、《蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准肯定义》