2023的线上事故复盘总结(OOM,数据库崩溃)持续更新中~

项目场景:

智慧门禁系统,公司研制的一个saas系统,基于Springcloud框架,主要是面向高校对老师学生的通行方式做统一的管理,可通过卡、码、脸等多种方式进出,可实现不同人员进出不同的场所,例如宿管人员不可进入图书馆。

在此也告诫我们,coding其实很简单,但是要考虑接口对数据库中间介的影响和接口可支持的并发量,你无法预测项目未来的用户量。


问题1: 项目OOM

有一场景是通过门禁系统对面板机进行下发人脸,项目OOM。


原因分析:

低级问题,进行数据下发,设备要求执行的协议是进行下发照片base64数据,想当然的对照片批量进行转换Base64(OOM)List体过大。


解决方案:

改为for循环,一张张照片转换下发,下发完成及时清理。

问题2: 项目OOM

有一场景是通过门禁系统对面板机进行下发人脸,后续调用业务系统OOM。


原因分析:

iot系统进行统一合并至物联网关后,业务线进行统一下发物联网关,不允许直接对接操作设备,由于同步人脸数量过多,整个学校的人员,大概两万多张。哈哈哈哈哈~并发过高,大量的Base64流打过去,物联网关系统down了。


解决方案:

1. 网关增加限流处理。

2. 由于图片是从阿里云取的,改为传递url,但是要注意图片有效期

问题3: mq疯狂堆积

有一场景是通过门禁系统对面板机进行下发人脸,发送mq进行异步处理,然后自消费下发到设备,线上mq疯狂堆积和重试,对公司所有业务线都造成了严重影响。


原因分析:

我特喵~我也是接盘的。

1. 发送mq没有考虑过这种场景是否适合使用mq,下发2w个人脸,直接mq怼怼怼了两万条进去,其中信息中还包含着base64流,一张照片1M算的话,2w张照片*设备数量,诸位自行体会mq的磁盘占有量。

2.没有考虑超时未回复ack的情况,在频繁重试。

3.异常处理不到位,对业务异常和代码异常都进行重试处理,如果是业务异常,照片不符合规范重试也没用。


解决方案:

1. 临时紧急发版,消费代码全部删除,全部进行消费。

2. 取消mq的使用,考虑下发人脸的场景既不涉及支付又无关痛痒,改为异步线程处理,LIst中含两万个名单,本身对内存占有率影响不大。

问题4: 数据库拖死

设备会实时的进行通行记录的上传,某某某同学通过哪个设备进入了哪里,由于校方有台设备长期处于离线过程中,某一天它突然上线了,开启离线上传,可谓是一瞬间怼过来了8w条数据,由于整个公司的业务线都是一个数据库上,导致其它业务线都受影响。


原因分析:

我特喵~我也是接盘的~也是之前哥们给我留的小惊喜

1. 主要还是接口的并发量过高。

2. 接收通行记录后,推送了一个大屏,没有人连接大屏的socket,也进行推送了,推送的代码中查询了通行记录这张表,这张表的数据量已经超级多了,也相当于查询了8w次,大批量慢sql。


解决方案:

1. 接口增加限流处理。

2. 项目问题太多了,影响到其它业务线了,把我们撵出来了....单独购买了一个数据库。

3. 不是当日的数据,不进行推送,无人连接socket,不进行推送。

4. 通行记录表索引优化。

复盘总结:

问题还有很多,正在整理过程中。

1.  在coding过程中,一定要做好代码评审环节。

2.  及时发现问题,钉钉告警群等,出问题第一时间知道,而不是用户反馈。

3.  运维工具要跟上,比如实时接口限流工具,出现问题接口直接阻断,进行流量打入。

4.  编码的性能和优化最终还是落在了我们mysql上,前期一定要规划好索引,查询语句要规划好,后期真的欲哭无泪。

你可能感兴趣的:(JAVA,工作复盘,springcloud)