专业在线打字练习平台-巧手打字通,只输出有价值的知识。
一 前言
在本次巧手打字通课堂
中,我们将深入探讨研发人员在日常工作中遭遇的线上事故之根源,并系统阐述一系列有效的规避策略与预防措施,旨在提升团队的整体作业安全与效率。
二 事故分析
以下统计了近30起线上事故的原因归类:
经过对线上事故问题的细致分类与分析,我们识别出技术层面的问题占据了显著比例,同时,个性化的运营环境挑战与不健全的系统设计缺陷亦是不容小觑的两大关键因素。进一步聚焦至事故的具体成因,可归纳为以下八大高危问题域。
- 技术编码漏洞;
- 数据库使用不当;
- 运营环境配置错误;
- 违反编码规范;
- 测试覆盖不全;
- 日志不规范输出;
- 安全意识薄弱;
- 中间件使用不当;
尽管完全消除所有问题极具挑战性,但规避过往已发生的错误与陷阱则相对可行。鉴于前人已对这些问题进行了详尽的分析并提炼出有效的解决方案,我们仅需积极学习并恰当应用这些经验,便能以更高的效率达成事半功倍的效果。
三 经典案例
下面将针对一系列具有代表性的典型案例进行简单剖析与总结,旨在为大家提供前车之鉴,帮助规避潜在风险,减少在相似情境下可能遭遇的弯路。
类别 | 原因 | 事故描述 | 事故总结 |
---|---|---|---|
设计 | MQ | 1.多个业务MQ公用一个topic主题,通过消息属性来区分业务场景,这会导致其中一个业务场景的mq消费积就会压严重影响了其它业务场景的消息消费; 2.MQ消费时长超过最大超时时间例如:120秒,这会导致后面所有消息积压无法快速消费; | 1.核心业务mq的topic分开,不要复用;2.mq消息只做轻量级的通知功能,不处理复杂的业务逻辑,如果有复杂的逻辑处理,考虑将消息本地化存储,通过分布式任务调度处理; |
运维 | 数据库 | 数据库主从集群切换导致两集群数据不一致;(主从数据有延时的情况) | 1. 切换后要注意检查新主库的数据完整性; 2. 严禁主从来回频繁切换,进而提高了数据不一致情况的发生; |
技术 | 数据库 | 1.数据库数据定期迁移历史库,突发的大量读写,导致主从延时严重; 2.应用层面实现了数据库的读写分离,部分业务读从库数据无结果。 | 控制数据库的数据量,比如:及时归档或分库; |
技术 | 规范 | 数据在两个之间通过应用进行同步,经过工具直接对一方的数据进行了更改但没有触发同步逻辑的机制,双方业务数据状态出现了不一致,造成业务损失; | 切记未经测试的功能直接上线; |
环境 | 配置 | 机器扩容忘记绑定host,导致扩容机器未生效; | 上线扩容自动化,避免存在人工干预的事项存在,减少运营心智负担; |
环境 | 测试 | 线上传参调用预发布环境,导致业务出现非预期的错误; 2.测试用例场景覆盖不全; | 不同环境要做隔离; |
技术 | 规范 | switch分支条件未写break语句,导致后续不应该执行的代码逻辑执行了; | 1. 接入编码规范扫描插件;2.核心逻辑做代码review; |
技术 | 漏洞 | 计算逻辑复杂导致接口可用率下降; | 极限边界思维,设置边界上限值,做好降级,防止雪崩; |
技术 | 配置 | 1.预发布和线上jvm的堆内存大小配置不一致; 2.新扩容机器分组用了预发布配置,导致扩容分组机器无法支持线上正常流量出现不可用情况; | 机器扩容一定要做到0门槛式操作; |
技术 | 漏洞 | 两个系统之间存在数据同步逻辑,发起方进行了数据创建动作后,立即又进行了取消动作,接收方只取消了部分已经同步; | 关注数据一致性设计; |
技术 | 配置 | 1.研发误将短链域名在nginx删除,导致前端result返回null; 2.前端未做code判断,且未做判空处理,直接使用数据出现程序异常; | 遵循谁污染谁治理,谁开发谁负责的原则; |
技术 | 漏洞 | 某优惠券被黑产领取了1万多张,导致对应缓存分片出现了大key,在优惠券使用的时候出现性能问题; | 极限边界思维,设置边界上限值,做好降级,防止雪崩; |
技术 | 漏洞 | 通过excel上传文件批量取消优惠券,由于文件中的时间格式有问题,导致时间转换出现异常,默认为当前系统时间,导致业务处理异常; | 异常处理是问题出现的高频场景 |
技术 | 数据库 | 代码层面使用long类型,数据库字段使用int类型,int溢出,导致数据库异常出现,影响订单生产; | 1. 设计要有长远视角; 2. 技术实现要前后自洽,杜绝埋坑; |
环境 | 配置 | 服务器磁盘空间使用率高,删除多余日志文件时,错误的删除了数据所在目录,导致数据丢失; | 服务器文件权限控制好,系统运营自动化,减少人工干预的情况 |
环境 | 规范 | 预发布引用了生产环境服务,导致向用户推送了大量无效文案; | 1. 环境隔离; 2. 底线思维,即使发错了,如何保证消息是能够取得正向反馈的; |
设计 | 漏洞 | 部分业务可以帮助用户自动领取最优券,结果误将赔付券多次领取到用户账户下面; | 产品设计也有可能存在问题; |
技术 | 漏洞 | 金额计算系统中存在十几个版本的特殊逻辑分支判断,其中某版本处理逻辑出现问题,导致为用户多发了一次运费优惠。 | 完善自动化测试用例,进行自动化回归测试 |
环境 | 安全 | 线上测试门店被人下单,多次拒绝客服解决方案,要求高额赔偿。 | 测试门店和商品有专人来维护运营,个人禁止创建线上测试门店; |
技术 | 漏洞 | 预发布和线上配置不一致导致逻辑处理不一致,这种情况预发布还无法验证出来; | 上线要进行小流量的灰度测试 |
设计 | 数据库 | ES某场景出现复杂查询影响到集群性能,导致其它相关核心业务也同步收到影响; | 1. 核心业务做好服务隔离; 2. 核心功能要有降级托底应急方案; |
环境 | 配置 | 将预发布环境的代码错误的直接部署到线上了 | 1.自动化上线流程要做git分支检测; 2.进行灰度验证; |
技术 | 漏洞 | 第三方返回结果json化解析出现异常,导致服务不可用; | 异常处理建议有兜底的统一捕获处理逻辑; |
技术 | 数据库 | 多表关联复杂查询,出现慢SQL,导致系统定时备份失败,数据库不可用。 | 1.重要系统原则上禁止多表关联查询;2.考虑其它实现方案(比如ES)来实现数据查询统计功能, |
技术 | 漏洞 | ExecutorCompletionService线程池使用不当导致OOM,只submit异步提交任务,没有调用get获取future结果,导致队列数据不删除,出现内存溢出; | 高并发场景,压力测试不能省略; |
技术 | 数据库 | 数据归档功能的慢sql导致核心功能不可用; | 1. 归档操作要在业务低峰期执行; 2. 读写分离,运用索引,运营端的like等操作尽量避免; 2. 做好降级,不影响主流程; |
技术 | 测试 | 获取短信内容的缓存key拼装逻辑错误,没有取到真实的短信消息内容,短信push发送“null“ ; | 1.研发自测环节不可少; 2.测试回归范围覆盖要全面; |
技术 | 数据库 | 缓存过期时间进行了调整,但历史数据没有做日期的更新处理,导致历史数据没有按照现有规则过期; | 1.方案设计时,注意数据一致性处理;2.重要变更设计需要评审环节 |
技术 | 日志 | 1.日志打印过多,导致cpu飙升; 2.redis存在大key和热key导致内存占用过高,最终导致服务可用率降低; | 1. 日志打印要收敛; 2. 线上日志级别调整开关要有变更通知预警机制; 3. 避免缓存大key和热key的出现; |
四 总结
线上事故频发的原因错综复杂,技术漏洞、运营环境挑战及系统设计缺陷共同构成了主要威胁。通过细致分类与深入分析,我们归纳出八大高危问题域,为后续的防范工作指明了方向。
面对挑战,我们应以前人经验为鉴,积极学习并应用成熟的解决方案,不断优化技术、提升管理、强化安全意识,从而有效规避潜在风险,确保线上环境的稳定与高效运行。
最后,希望本文对读者有所启发和帮助。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。