翻车了,记一次线上事故

nanjingfm · · 2950 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

关键词:golang、go、gorm、零值、有担当的富人 翻车日期:2021.03.04 # 翻车现场 今天下午3:30有同事反馈,app冷启动出现了测试公告弹窗。 ![image-20210304201616977](https://bbk-images.oss-cn-shanghai.aliyuncs.com/typora/20210304201617.png) > `画外音:`半小时前刚更新一个服务,赶紧检查下配置吧。 # 事件回述 - 10:27:代码发布sandbox环境 - 10:27~11:30:测试配置导入(因为配置比较多)生产环境,并手动修改少量差异配置 - 11:30~11:50:sandbox环境验收完成 - 11:51: api开始灰度 - 12:46: 灰度结束,api全量发布 - 15:00: 优化配置解析,重新发布了config服务 - 15:30: 同事反馈app冷启动有测试弹窗,立即检查并修正公告配置 # 蛛丝马迹 上午上线了一个需求,迁移了`48条`配置到业务配置中心(原来的配置是硬编码在项目里面的,每次改都要修改代码重新发布)。 上午上线之前明明验收过,没有问题才发生产的呀! 为了验证迁移之后接口一致性,我还特地安装了一个json-diff工具([官网](https://www.npmjs.com/package/json-diff)),还特地从`4.x`、`5.x`、`6.x`验证了多个版本的配置,都没有问题。 ![image-20210304201103809](https://bbk-images.oss-cn-shanghai.aliyuncs.com/typora/20210304201103.png) 为啥现在有几条配置跟我验证时候的不一样了呢? ![image-20210304201442816](https://bbk-images.oss-cn-shanghai.aliyuncs.com/typora/20210304201442.png) 等等,这些文案不是测试环境的文案么? > `画外音`:这个很可疑哦! # 来龙去脉 因为配置文件比较多,一个个在生产环境加太麻烦了,我就直接把测试配置导入到生产环境中。然后手动修改下生产和测试不一致的几条配置,其中就包含了`测试公告`的几条配置。 > `画外音`:但是为什么验收的时候是好的,然后下午重新发布了下服务就出问题了呢? 我打开数据库,看到数据库里面这几条配置记录还是测试的配置,并没有修改过来。。。我打开我的goland,翻看了下编辑接口代码,一下就发现了可疑之处: ```go err := tx.Table(p.tableName).Where("id=?", configID).Updates(t).Error ``` `gorm`的`Updates`有个坑啊——如果你传的是一个`struct`,`gorm`默认是不更新`“零值”`字段的。这个坑我早就知道,无奈再一次重重的的踩进去了。`git blame`看了下作者——原来就是我自己,去年12月份写下的😭(自己的坑自己填,好在没有祸害到别人)。 # 豁然明朗 我画了一个简图,方便大家明白: ![image-20210304203053829](https://bbk-images.oss-cn-shanghai.aliyuncs.com/typora/20210304203053.png) - 配置服务是无状态服务,所有配置都保存在内存中(业务配置不多,不会爆内存) - 服务启动的时候从mysql(持久化存储)加载所有配置,并与etcd保持一致性 - 增量配置会保存到mysql中,并通过etcd保持所有节点同步 > `画外音`:终于知道了为什么上午验收是好的,下午重启就出问题了!!! 上午导入的测试配置,生产环境正好要把他们其中几条改成`空值`。增量数据通过etcd同步到内存是正确的,但是持久化到`mysql`的时候`gorm`把应该置空的字段`忽略`了,导致数据库里面没有修改正确。下午一重启,GG。。。 # 总结 领导好像没有说什么,因为没有客诉,事情并不是很大。 > `画外音`:既然领导没有说故障定责,要不就这样算了? 犹豫了半分钟——还是主动写个故障报告吧。 我犹豫的是,没有产生客诉,问题时间不长,而且犯得是这么低级的错误,是不是睁一只眼闭一只眼就过去了。。。 还是写了报告是因为内心告诉我,小事都不能承担责任,大事(优质项目)还轮得到我么? 最近看了《穷爸爸 富爸爸》这本书,书中说到`“穷人的恐惧包括:害怕付不起账单、害怕被解雇、害怕没有足够的钱、害怕重新开始等等”`。简单说就是,穷人总数怕这怕那。而这一次,我选择了做个有担当的富人😭。。。 # 教训与改进 - 使用`json-diff`工具,自认为可以`100%`验证,就自测上线 - 数据同步场景不仅仅要观察表象,也要关注持久化数据是否与表象一致 - 加强开发规范,需求不分大小,都需要请测试把关 - `不能盲目自信,保持一颗敬畏的心` 关键词:golang、go、gorm、零值、有担当的富人

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2950 次点击  ∙  2 赞  
加入收藏 微博
3 回复  |  直到 2021-03-12 11:11:53
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传