后端开发的世界里,技术选型如同走钢丝,左边是过度设计,右边是技术债台高筑。选对了,系统稳如磐石;选错了,半夜报警就成了家常便饭。技术栈没有绝对的好坏,只有合不合适。以下十个坑,踩过一个,都够你喝一壶。
微服务不是万能药。业务还没复杂到需要拆分,团队还没准备好应对分布式事务,就急吼吼上微服务。结果服务拆了三十个,调用链长得像迷宫,一个请求超时,查三天找不到根因。单体都写不好的团队,拆成微服务只会死得更快。先把手头的事做简单,再谈架构升级。
NoSQL被当成银弹。关系型数据库还没优化,就一头扎进MongoDB。数据一致性不要了,事务不要了,最后发现连个多表关联查询都写不出来。NoSQL是特长生,不是全能选手。没有明确场景,老老实实用MySQL,它比你想象的能扛。
消息队列滥用成灾。两个服务之间调个接口,也要塞进Kafka。系统里跑着七八个Topic,消息顺序、重复消费、积压告警,问题比业务还多。异步不是目的,解耦才是。同步能解决的,别用队列绕远路。
索引拍脑袋乱加。见查询慢就加索引,一张表挂了十几个。写入性能暴跌,存储空间暴涨,优化器选错索引反而更慢。索引是药,剂量对了治病,过量了要命。读懂执行计划,比盲目加索引强一百倍。
缓存用成数据源。把Redis当数据库使,缓存一挂,全站雪崩。过期策略不设,内存爆了才知道。缓存是加速器,不是保险箱。数据持久化的事,交给该干的人。
分布式事务硬上。两阶段提交、TCC、Saga,名词背得滚瓜烂熟,业务量却小得可怜。为了一个转账功能,引入整套分布式事务框架,复杂度飙升,bug层出不穷。没有千万级流量,别碰分布式事务。单体事务加本地消息表,够你用很久。
容器化过度。三个人的团队,五个服务,非要上Kubernetes。YAML写了上千行,运维成本比开发还高。容器编排是规模的艺术,小团队玩不转就是自找麻烦。Docker加个脚本,简单直接。
服务网格过早引入。Istio确实强大,流量管理、安全、可观测性一应俱全。可你的服务间调用还没超过十个,Sidecar却吃掉了一半资源。杀鸡不用牛刀,牛刀还得配个磨刀师傅。没有专职运维,别碰服务网格。
监控日志形同虚设。系统上线就完事,日志不收集,指标不监控,告警不配置。出了故障靠用户投诉才知道,排查靠猜。没有可观测性的系统,等于蒙眼开车。Prometheus加Grafana,ELK加告警,早配早省心。
技术栈堆砌成瘾。新框架一出就想换,今天React明天Vue,后端从Spring换到Go又换到Rust。团队疲于奔命,项目进度一拖再拖。技术是工具,业务是目的。把一门技术吃透,比浅尝辄止十门强得多。
布鲁克斯说:“没有银弹。”后端开发没有一劳永逸的架构,只有持续权衡。少即是多,慢即是快。选技术栈前,先问自己:业务真需要吗?团队真hold住吗?运维真扛得动吗?三个问题答不上来,就别急着动手。毕竟,系统是给人用的,不是给简历贴金的。避开这十个坑,你的后端之路会平坦许多。