嗨,朋友们,我是小米,一个31岁还在码农江湖里摸爬滚打的程序员。今天不聊鸡汤,不卷面试,咱聊点实战里的设计博弈。
故事开头:项目来了!事情是这样的,最近我接了个新项目,感觉蛮有意思的,忍不住想来分享下,毕竟程序员的世界,代码背后都是故事。
项目主要分成了三个主体:
门户
商城
渠道
其中商城的积分也算是渠道的一种,这个设定其实一开始我有点懵,听着别扭。为什么商城自己的积分要算渠道?后来我才明白,是为了系统内统一规范,避免后期扩展的时候乱成一锅粥。
项目主要的业务流程是这样的:
门户负责内容展示和引导
商城用来下单、扣积分、结算
渠道是合作方的接入口子,包括第三方合作、活动推广啥的
重点来了:商城在下单的时候要扣减自己的积分。
生哥给我讲需求,我愣住了!说到这,我就得介绍一下我项目里的老大哥——生哥。
生哥是我们组的老程序员,经验老到,出事稳得一匹,领导信任,兄弟们敬重,妥妥的技术老炮。一天他找我去会议室,给我讲这个需求。
生哥说:
小米啊,商城下单扣积分的时候,咱们得走统一的鉴权服务,通过鉴权服务调开放平台,再调具体的积分服务,保证渠道统一调用路径。
我一听,脑子里就冒出个大大的“??”
为什么商城调用自己的积分,也得跟渠道一样,写个http请求调鉴权服务,再调开放平台,再调积分服务?
这不多此一举吗?
我赶紧问了生哥:
生哥,商城自个调用自己积分,不是直接调积分服务接口就完了吗,干嘛还绕一圈?这多浪费资源啊。
生哥笑了笑,说了句:
为了统一。
“统一”,确实是个高频词,也是很多大厂喜欢挂嘴边的原则。
我当时没说啥,回到座位上,越琢磨越觉得不对劲。
我来分析一下:这个设计的隐患咱们来好好捋捋:
按照生哥这个设计,链路是这样的:
商城发起下单
发http请求到鉴权服务
鉴权服务校验签名、token、权限
调用开放平台
开放平台再调积分服务
积分服务扣减积分
返回开放平台
返回鉴权服务
最后商城拿到扣减结果,继续下单流程
是不是有点“兜圈子”?
我马上列了几个风险点:
链路越长,稳定性越差:中间多了两层服务,任何一环挂了,都会导致下单失败,商城体验直接炸裂。
高并发压力大:鉴权服务和开放平台本来就是多渠道共享的核心服务,商城下单量本来就高,硬要走这条路,系统一旦高并发,瓶颈先从这里炸开。
扩容麻烦,成本增加:鉴权服务、开放平台要跟着商城一起扩容,server多了,money也多了,公司不差钱是好事,但谁的钱都不是大风刮来的。
没必要的“规范”:明明商城自己业务场景下,直接调用积分服务最快最稳,为了所谓“统一”牺牲性能、稳定性、成本,太得不偿失了。
我提了个方案,结果……我憋了一晚上,第二天特意约了生哥,做了个简单的流程图和说明,跟他说了我的想法。
我说:
生哥,要不咱商城自己调用积分服务,其他渠道再走鉴权+开放平台路径。
商城是内部业务,安全性咱们可以通过局域网访问、IP白名单、签名校验搞定,没必要强行走外部链路。
生哥想了想,给我丢了句:
统一就好维护。
我赶紧接着说:
统一≠一刀切,统一可以在规范上,比如接口设计统一,安全校验统一,但调用路径不一定非要一样。商城内部调用和渠道外部调用,本质场景不同,设计成一样反而是个坑。
生哥点了点头,让我整理一下,再开个需求评审。
评审会上,大家也有争议说实话,评审会上,组里的人分成了两派:
1、支持我的
小马哥:商城内部调用,稳定、快、省资源,应该走独立链路。
娜姐:商城跟渠道场景本来就不同,非要凑一块,后面商城业务改版还得拆,麻烦。
2、支持生哥的
二虎:统一路径,好排查问题。
文哥:统一链路可以复用开放平台的安全校验,少写代码。
大家吵得挺热闹,但争论归争论,最终拍板还是生哥和项目经理。
最终方案定了!经过几轮讨论,最后方案定了:
商城直接调用积分服务
其他渠道继续走鉴权+开放平台+积分服务链路
商城独立链路也要做签名校验、token认证,保证安全统一
这下,既保证了:
调用链路最短,性能最佳
高并发压力分摊
安全机制统一
成本控制合理
我心里也乐开了花。
最后聊聊我自己的思考通过这件事,我有几点特别想跟同行们分享的:
1、统一 ≠ 一刀切
很多时候我们听到“统一”,就觉得要把所有调用方式、链路设计弄得一模一样。其实不是,统一的是规范、接口设计、校验机制,而不是调用链路。
2、内部业务场景和外部业务场景,本质不同
商城是公司自己产品,走内网,权限、调用频率都可控,和第三方渠道完全是两种情况,设计方案一定要因地制宜。
3、代码易维护 ≠ 系统高性能
有时候为了省事写代码,统一走一个路径,表面上看好维护,但链路复杂,系统性能差、故障率高,维护起来才是真麻烦。
4、技术人要敢说,敢争论
就像这次,我一开始也不太敢跟生哥提反对意见,但后来发现,咱有理有据,谁都得服。技术是靠说理、验证、推导出来的,怕啥。
总结一下这次项目,我最大的收获就是:
技术方案要根据实际业务场景来定
所谓“统一”,不能为了形式而牺牲性能、稳定性、成本
沟通争论是好事,方案就是越争越完善
如果你也遇到过类似的情况,或者正在跟老大哥们博弈设计方案,欢迎评论区留言,咱们一起探讨探讨。