一、一个 P0 工单:两条扣款短信
工单 #4471,优先级 P0。
玩家买了一个 68 元的枪械皮肤。网络抖了一下,转圈了三秒,然后弹出「购买失败,请重试」。
他点了重试。成功了。
然后他收到了两条扣款短信。
背包里躺着一个皮肤,账单上写着两笔钱。
客服说「我们核实一下」。程序员打开日志,看到了两条一模一样的请求——时间差 3.2 秒,参数完全相同,都成功了。
服务端没有 bug。它只是忠实地执行了两次它收到的两条命令。
这个故事的真正问题是:
在一个「请求可能重复到达」的世界里,你的接口必须假设自己会被调用两次。
这个结论不是从「幂等」这个词学来的,而是从"网络会丢包,客户端会重试"这个无法回避的事实推出来的。本文就从这里开始,解释为什么业务接口要用短连接,以及短连接带来的那些必须配套解决的设计问题。
二、银行柜台,还是私人管家
上一篇讲过,战斗必须走长连接——因为服务器要主动推。
那为什么登录、商城、邮件、排行,偏偏要用「用完就扔」的短连接?
2.1 两种服务模式
长连接 = 私人管家</