一、标准的CaseStudy

1.为什么要写CaseStudy?

  • 记录事件并且跟踪后续改进

  • 吸取教训,分析发现问题并杜绝改善

  • 促进团队学习和成长

  • 增进团队合作以及团队内的信赖关系

2.写CaseStudy的方法是什么?

  • 事故描述:时间、人物、简述。

  • 时间需要精确到分钟。

  • 人物需要写明跟进人,如果责任人明确,需要写上责任人。

  • 事故简述:需要用1-2句话简短的描述问题。

  • 事故详情:详细阐述case发生的每个时间点所发生的事情。什么时间、现象、如何发现、做了什么事情、如何解决的问题等。按照时序图尽可能的还原事故现场以及解决步骤。

  • 影响和损失:客观地评估影响。例如:损失的金钱,受影响的请求书/用户数/订单数/受影响的时间。要用具体数字予以量化,不能用“较多”、“部分”这种模糊词。

  • 分析原因:刨根问底,找到case的根源,以及解决的办法。可以采用5whys分析法。一步一步往深追,一层一层找原因,尽可能达到一个真相大白的境地。

二、非标准的事实

1.追查问题的一般思路

  • 确认任务:XX系统XX功能出现了XX的问题

  • 复现问题:线上出现慢查询问题:追查原因发现是因为value=null所导致。

  • 定位问题:查看日志,监控,调试。利用一切可以采用的方法,大胆假设,小心论证,不断缩小范围,逼近真相。

  • 解决问题:解决问题的时候要避免引入新的问题,不能因为着急引发连环Case。

  • 预防问题:杜绝根本原因,吸取接受的教训。例如在框架里面做预防,凡是value为null不查数据库。

2.实际情况:

  • 偶尔出了问题,后来又好了,但是去查日志,确实是有异常的。但是无论如何都复现不了。

  • 应对策略:(多加日志,善于报警,事前预防,便于事后分析)

三、部分CaseStudy实例

1.CaseStudy-20151221-整理名单库代码导致规则平台的名单库功能部分失效   (链接:http://wiki.sankuai.com/x/c44dFw)

    由于顺手将expireTime的的类型由Integer改为Long导致的问题。最终导致白名单读取失败,拦截正常用户3434个;黑名单读取失败放过作弊用户。

2.CaseStudy-20141209-上线导致tatooine廊坊机器停止服务40分钟 (链接:http://wiki.sankuai.com/x/rAcWBw

    由于流量组更换了数据源,在信息不对称的情况下仅仅更改了几个文字,重新上线后导致tatooine廊坊机器停止服务40分钟。

3.CaseStudy-20150717,20150718-高峰时期风控服务性能异常问题调查(链接:http://wiki.sankuai.com/x/oKM7Dw)

    无法复现。线上流量过大,服务性能特别差。平时10ms左右,故障时间达到100ms~300ms,增加超时时间。导致队列堆积,导致报警。

    追查问题:1.监控没有做到位,业务方反馈得到的消息。2.最后没有查处问题具体原因,但是上线了定时压测系统,把系统的服务做高了。

四.结尾总结

1.相关建议

  • 上线前充分测试,上线后确认功能正常

  • 上线服务前增加充足的监控

  • 不要操作线上机器,数据

  • 服务器的处理能力准备一些冗余

  • 解决问题必须彻底,完美

  • 可能踩坑的地方一定会踩到,有可能犯错的地方一定会犯错。(墨菲定律)

  • 不要把问题都留给QA,自己应该养成review的好习惯。

2.减少事故损失的一些办法

  • 立即回滚代码

  • 服务的部署尽量独立和隔离

  • 做好服务降级备案

  • 上线避开高峰期或选择灰度发布

  • 重大上线做好回滚预案,添加足够监控

  • 好的业务实现设计,多思考各种异常情况下的程序处理方式,对外部系统错误的良好应对,有效的正常或异常日志

3.讲师的体会

  • 问题追查!=追究责任

  • 更重要的是从中吸取到的教训和问题的总结和改进

  • 一些问题如果反复出现,一定要重视,不可以忍受

  • 后续改进要落实!避免问题再次发生。

  • 无标签