后端架构演进:从单体到云原生——一个裸辞半年的前大厂人的碎碎念
上周五晚上十一点,我蹲在老家阳台上抽完最后一根烟,盯着手机里那个“Go微服务容器化部署方案”的文档发呆。风吹得有点凉,但比不上心里那种空落落的感觉。
去年十月,我从北京某大厂后端岗裸辞,带着攒下的十几万存款和一身疲惫回到南方小城。当时月薪22k,房租3500,加班到凌晨是家常便饭。老婆说:“再这样下去,你迟早进ICU。” 我想了想,算了,gap半年吧,看看世界,也看看自己。
结果“世界”没看成,倒是把简历投了一轮又一轮,面试聊得最多的话题,居然是“你们当年是怎么从单体架构迁移到云原生的?”
单体时代:我和爬虫一起熬过的夜
刚入行那会儿(大概2018年),我在一家做电商数据服务的公司,整个后端就一个Java项目,代码量快上百万行。数据库一张主表,用户、商品、订单全塞一块儿,连日志都写同一个库里。
最离谱的是,我们居然还要写爬虫!对,就是那种半夜偷偷抓别人网站数据的玩意儿。老板说:“友商价格更新快,咱们得实时监控。” 于是我和另一个同事,硬是在这个庞大的单体应用里,硬塞了一个Python写的爬虫模块——用subprocess调外部脚本,结果经常把整个服务搞崩。
有一次凌晨三点,生产环境挂了。我一边重启服务,一边改爬虫的User-Agent轮换逻辑,嘴里骂着“这破架构谁设计的”,转头发现设计者就是我自己三个月前写的PR。
那时候的开发心得就一条:能跑就行,别动线上。
微服务初体验:拆!拆!拆!
后来跳槽进了大厂,赶上了微服务浪潮。团队决定把那个“巨无霸”拆成十几个服务:用户中心、商品服务、订单系统、爬虫调度平台……每个服务独立部署,用gRPC通信。
我被分去负责爬虫调度服务,用Go重写。为什么选Go?因为并发强、启动快、内存占用低——特别适合做高频IO的爬虫任务。而且Go的goroutine写起来爽得不行,再也不用担心Python的GIL锁住线程了。
记得第一次上线那天,我和运维老张在机房守到早上六点。他叼着烟说:“你这Go服务才80MB内存,Java那边动不动2G,真省资源。” 我嘿嘿一笑,心里其实慌得一批——万一出问题,我这“新兵蛋子”可扛不住P0事故。
但事实证明,微服务确实香。某个服务挂了,不会拖垮整个系统;爬虫崩了,用户照样能下单。迭代也快了,以前改个功能要全量回归测试,现在只测自己服务就行。
不过代价也很明显:分布式事务、链路追踪、服务注册发现……这些词突然成了日常。有次排查一个超时问题,查了三天才发现是etcd选举卡住了。那一刻我深刻体会到:微服务不是银弹,它只是把单体的问题,换了一种更复杂的方式呈现。
云原生:K8s救我狗命
真正让我感受到“架构自由”的,是上云原生。
大厂那会儿,我们开始全面拥抱Kubernetes。每个微服务打包成Docker镜像,推到Harbor仓库,用Helm Chart一键部署到K8s集群。自动扩缩容、健康检查、滚动更新……运维老张终于不用半夜被叫起来重启服务了。
我的Go爬虫服务也做了改造:
- 把配置外置到ConfigMap
- 日志输出到stdout交给Fluentd收集
- 用Prometheus暴露指标,比如“每分钟抓取页数”、“失败率”
- 资源限制设为CPU 500m,内存256Mi
最爽的是弹性伸缩。比如双十一大促前,我们提前把爬虫Pod副本从3扩到20,活动一结束自动缩回去。再也不用像以前那样,手动开十几台虚拟机,活动完还得一台台关——累死不说,还容易漏。
但云原生也有坑。有次我忘了给Pod加liveness probe,结果程序假死,K8s以为它还活着,流量一直打进来,最后导致下游API被刷爆。那次复盘会上,TL看着我说:“架构演进不是堆技术,是堆责任。”
这句话我记到现在。
裸辞后的反思:技术之外,人在哪?
Gap这半年,我回老家陪父母,也接了些外包活儿维持生计。上个月帮一个本地农产品电商重构后端,他们还在用PHP+MySQL的单体架构,爬虫直接写在WordPress插件里……
我差点脱口而出:“你们得上微服务!上K8s!”
但看到老板娘一边哄孩子一边算账的样子,我把话咽了回去。
不是所有业务都需要云原生。如果日活就几百人,单体+合理分层+良好监控,完全够用。强行上微服务,只会增加维护成本,让本就不多的开发资源更加捉襟见肘。
这让我想起自己在大厂时的“技术傲慢”——总觉得架构越复杂越高级,却忘了问一句:业务真的需要吗?
回老家,还是回大厂?
上周,一家二线城市的大数据公司给我开出了18k的offer,要求用Go搭建云原生数据采集平台,包含分布式爬虫调度。老婆问我:“去吗?”
我沉默了很久。
大厂节奏快、技术新,但身心俱疲;老家生活安逸,可技术氛围薄弱,成长慢。月薪从22k降到18k,但房租只要800,还能天天回家吃饭。
最终我答应了。不是因为钱,而是因为——他们愿意让我从0到1设计架构,而不是在已有体系里当一颗螺丝。
这次,我想把开发心得真正落地:
- 小步快跑,先跑通核心链路
- 爬虫服务用Go + Redis队列 + 动态代理池
- 监控用Loki+Promtail+Grafana轻量组合
- 部署上阿里云ACK,但初期只开3个Node
不追求一步到位云原生,而是“够用且可演进”。毕竟,架构是为人服务的,不是反过来。
写在最后
从单体到微服务,再到云原生,技术一直在变。但不变的是:我们写代码,终究是为了让人活得更好一点——不管是用户,还是我们自己。
如果你也在纠结要不要裸辞、要不要回老家、要不要学Go、要不要搞云原生……我的建议是:
先问问自己:
“我现在做的东西,五年后回头看,会觉得值得吗?”
如果答案是否定的,那就改变。哪怕慢一点,哪怕绕点路。
毕竟,人生不是K8s集群,没有“自动修复”功能。但好在,我们还有选择的权利。
—— 一个正在老家调试Go爬虫服务的前大厂人,于2024年6月

评论 0