本网站用于展示个人工作中的积累与笔记,表达个人对工作与学习的思考方式。
作为一名拥有13年经验的技术从业者,我在这里记录和分享在软件开发、系统架构、问题排查等方面的实践经验和解决方案。
记录工作积累 · 分享技术思考
本网站用于展示个人工作中的积累与笔记,表达个人对工作与学习的思考方式。
作为一名拥有13年经验的技术从业者,我在这里记录和分享在软件开发、系统架构、问题排查等方面的实践经验和解决方案。
问题:生产环境频繁Full GC导致应用卡顿
排查思路:
解决方案:调整堆内存大小,优化老年代比例,使用G1收集器替代CMS,修复代码中的内存泄漏问题(如未关闭的连接、缓存未设置过期时间)
问题:高并发场景下出现死锁
排查思路:
解决方案:统一锁的获取顺序,使用tryLock设置超时时间,避免嵌套锁,使用并发工具类替代手动加锁
问题:HashMap在多线程环境下出现死循环
原因分析:JDK7中HashMap扩容时采用头插法,多线程并发扩容可能形成环形链表
解决方案:使用ConcurrentHashMap替代HashMap,或使用Collections.synchronizedMap包装,避免在多线程环境下共享HashMap实例
问题:Spring Boot应用启动缓慢,耗时超过1分钟
排查思路:
解决方案:精确指定@ComponentScan范围,使用@Lazy延迟加载非必要Bean,排除不需要的自动配置类,优化数据库连接池初始化
问题:微服务调用链路超时,导致雪崩效应
排查思路:
解决方案:配置合理的超时时间(Feign、Ribbon、Hystrix),启用Sentinel熔断降级,优化慢接口性能,使用异步调用解耦非关键链路
问题:MyBatis一级缓存导致数据不一致
原因分析:同一个SqlSession中,相同查询会命中一级缓存,但其他事务的更新操作不会清空该缓存
解决方案:在Spring中配置SqlSession作用域为prototype,或在查询前调用clearCache(),关键业务使用@Transactional确保事务隔离
问题:慢查询导致数据库CPU飙升
排查思路:
解决方案:为WHERE、ORDER BY、JOIN字段添加合适索引,避免SELECT *,优化子查询为JOIN,分页查询使用延迟关联,大表查询添加分区
问题:高并发下出现死锁
排查思路:执行SHOW ENGINE INNODB STATUS查看死锁日志
解决方案:统一事务中锁的获取顺序,缩小事务范围,降低事务隔离级别(如改为RC),使用乐观锁替代悲观锁
问题:表空间不足导致应用无法写入
应急处理:ALTER TABLESPACE增加数据文件或扩展现有文件大小
长期方案:设置数据文件自动扩展,定期清理历史数据,归档日志及时备份删除,监控表空间使用率并设置告警
问题:缓存穿透、击穿、雪崩
缓存穿透:查询不存在的数据,缓存和数据库都没有。解决方案:布隆过滤器、缓存空值
缓存击穿:热点key过期瞬间大量请求打到数据库。解决方案:热点数据永不过期、互斥锁、逻辑过期
缓存雪崩:大量key同时过期。解决方案:过期时间加随机值、多级缓存、限流降级
问题:Redis内存占用过高
排查思路:使用MEMORY USAGE查看key占用,INFO memory查看整体内存
解决方案:设置合理的过期时间,使用Hash结构压缩小对象,开启key淘汰策略,定期清理无用数据,考虑数据分片
问题:消息堆积导致消费延迟
排查思路:通过控制台查看消费组堆积量、消费TPS、消费延迟时间
解决方案:增加消费者实例数量,优化消费逻辑减少处理时间,批量消费提高吞吐量,临时扩容Topic队列数,考虑消息过滤减少无效消费
问题:消息重复消费
原因分析:网络抖动、消费者宕机、消费超时等导致消息重新投递
解决方案:业务层实现幂等性(唯一键、状态机、分布式锁),使用数据库唯一索引防重,Redis记录已处理消息ID
问题:ZooKeeper集群脑裂
原因分析:网络分区导致集群分裂成多个子集群
解决方案:确保集群节点数为奇数(2N+1),配置合理的心跳超时时间,使用独立的网络环境,监控网络质量
问题:TCP粘包拆包问题
解决方案:使用固定长度解码器FixedLengthFrameDecoder,分隔符解码器DelimiterBasedFrameDecoder,长度字段解码器LengthFieldBasedFrameDecoder,自定义协议添加消息头
问题:Pod一直处于Pending状态
排查思路:
解决方案:调整资源请求量,添加节点或清理资源,配置容忍度,使用私有镜像仓库并配置imagePullSecrets
问题:服务间调用超时或失败
排查思路:检查Service配置、网络策略、DNS解析、端口映射
解决方案:确认Service selector与Pod labels匹配,检查targetPort配置,验证网络插件工作正常,使用服务网格(Istio)增强可观测性
问题:构建过程中内存溢出
解决方案:调整Jenkins JVM参数(-Xmx),为Maven构建配置MAVEN_OPTS,使用增量编译,清理workspace历史构建产物
问题:GitLab Runner构建队列堆积
解决方案:增加Runner数量,使用标签分配不同类型任务,配置并发数concurrent,优化Pipeline减少不必要的Job
问题:502 Bad Gateway错误
排查思路:检查后端服务是否正常、upstream配置是否正确、超时时间设置
解决方案:确认后端服务启动,调整proxy_connect_timeout和proxy_read_timeout,检查防火墙规则,查看error.log定位具体原因
问题:服务器负载高,响应缓慢
排查思路:
解决方案:优化应用程序性能,增加服务器资源,使用缓存减少数据库压力,配置连接池限制并发,启用负载均衡分散流量