你问十个工程师最中意的技术栈角落是哪里,答案几乎绕开了同一样东西——计费。代码里沾上计费逻辑,就像面团掉进芝麻堆,想摘干净注定会扯出无数条胶黏的边角料。但对于一家叫exe的公司而言,计费反而成了重构叙事里最“干净”的一环。他们的诀窍说出来有点反直觉:别在业务代码里直接给Stripe交钱,而是先告诉系统“发生了什么”,再让系统自己去算一个数给Stripe。因为说到底,Stripe想要的只是一个数字。
这事要从exe最早期的计费实现说起。那时候团队的做法并不特殊:一个大大的函数,既要改数据库,也要顺道调一次Stripe的计费API。比如给团队加一个成员的操作。代码在一个数据库事务里更新成员数量,同一段执行路径里毫不犹豫地发出一串计费请求。写过计费代码的人多半都这么干过。
但几个问题会像报时器一样准点出现。加人的逻辑里,计费调用到底该放在事务提交前还是提交后?万一计费调用失败,数据库已经改了怎么办?要是调整了团队席位的计算规则,难道还得去改“加人”这段核心业务逻辑?这些计费边界场景一旦多起来,代码就会脆得像晒干的面条——稍微一掰全断。
exe的那位工程师——也就是专门对付“发动机气缸垫”级疑难杂症的人——决定先不发货了事。他换了个思路:别把计费API调用散落在各处业务代码里,而是让产品事件向计费系统发出一条消息,大意是“有状态变了,你可能需要为此收钱”。他把这种原子化的状态变更通知叫作“可计费事实”(billable facts)。
新流程的逻辑一下子就干净了。业务操作发生后,先产出一条可计费事实,表明某类资源的状态出现了增减。计费侧拿到这组原子事实后,完全独立地进行业务演算,算出资源的新状态,最后再把状态与Stripe进行对账和同步。给团队成员加新席位也好,记录虚拟机磁盘用量也罢,业务层只管把变化喂进事实队列,剩下的计费对账工作由专门的worker完成。新增成员的代码再也不必挂着一段计费调用,修改席位计算规则也不会碰坏员工入职流程。
随着exe的体量持续增长,这种“先记事实,再用事实算出账单”的模式表现出了相当好的伸缩性。所有按量计费的管道——包括活跃虚拟机的磁盘用量数据——都沿着同一条对账流水线运转。系统负责发出关于资源使用的可计费事实,而计量worker则把对账做完,最后把结果更新到Stripe上去。
那位工程师对此有一句很朴素的判断:Stripe只需要一个数字,它根本不在乎你是怎么算出来的。把计费逻辑从业务“热路径”里摘出来之后,整个工程团队都获得了可以放手修改任何模块的权利,而不必担心不经意间弄坏账单。而那个偶尔冒出的怪诞边界场景,依然由他负责钻进引擎核心去撬开发动机。只是在那之前,计费已经从“每人都得擦的脏玻璃”变成了“一套安静的后台核算”。
热门跟贴