一个技术栈里最可靠的部分,往往最没人愿意展示。它没有精巧的分层可以指点,也正因为如此,它才从不宕机。
本周要聊的支付服务就是典型例子。它前面只有一个队列,负责承接所有进入的扣款请求;后面只有一个关系型数据库,负责把每笔扣款记录得清清楚楚。整套系统四年来就是这个样子。
新来的工程师每次都会问:为什么这么简陋?没有事件网格,没有服务星座,没有让页面看起来更快的缓存层。每年有两次,有人提议重新设计;每年有两次,答案都是“不”。
然后黑五来了。推荐引擎在流量下崩溃,搜索结果开始卡顿,移动端一半屏幕报错,客服工单堆积成山。而支付服务始终正常:每一个到达的订单都被处理,且只处理一次,没有任何一笔重复扣款。
无聊从来不是没有野心,无聊本身就是设计。
真正干活的部件都有名字。Service 是当你站在那里等待时回应你的那个东西,就像服务员接单后端上菜。Queue 是一条等待线,让不需要立刻完成的工作先落在安全区,而不是被突发流量冲掉。Relational Database 是账本,它能够确定地说:这笔扣款发生了,且只发生一次。一个 Service,一个 Queue,一个 Relational Database。三件套,不是十件套。
Stripe 的支付 API 也体现了同样的克制。每次请求都可以带一个幂等键,意思是“如果你看到两次,这就是同一个请求”。网络丢包了,你重试,Stripe 靠这个键识别出重复,从而避免重复扣款。
最稳的系统不是堆出来的,而是省出来的。真正值得炫耀的,往往是那些看起来最不起眼的部分。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.