本文就项目上线部署发布做一些探讨,只做抛砖引玉,错漏之处欢迎评论指出,+V luosanlechang
背景
我们日常的生产发布很多团队都是停服发布新版,其实在用户量访问频繁,规模大的系统,很多是不允许停服升级的,或者他们选择半夜发布,其实都是很不明智的做法,不仅花时间而且花精力。
试想一下,一个正在运行 Java 应用如果突然将其停止,影响不止数据丢失,还会造成其他影响。比如:
请求丢失:内存队列中等待执行请求丢失
数据丢失:处于内存缓存中数据未持久化到磁盘
文件损坏:正在写的文件没有没有更新完成,导致文件损坏
业务中断:处理一半的业务被强行中断,如支付成功了,却没有更新到数据库中
服务未下线:上游服务依然往停止节点发送请求
所以在关闭服务之前,我们需要先做好善后工作,比如保存数据,清理资源,下线服务,然后才退出应用。这种有计划平滑的关闭应用相对直接停止应用,就显得非常『优雅』。
同理,前端发布页面版本也会出现这种访问和缓存错误问题。
因为选择合理的发布方式尤其重要,不同规模的团队和应用也有不同阶段的发布方式选型。
常见发布方式
停机发布
功能开关发布:利用代码中的功能开关(Feature Flag/Toggle/Switch)来控制发布逻辑。
蓝绿发布:两套环境交替升级,旧版本保留一定时间便于回滚。
金丝雀发布(灰度发布):小比例发布,测试通过后再全量,例如 2% 的服务器,主要做流量验证用ÿ