网易首页 > 网易号 > 正文 申请入驻

支付接口超时后重复扣款,为什么加锁还不够?

0
分享至

支付系统对接外部服务商(PSP)时,网络延迟导致的超时失败,是数据不一致的常见来源。翻交易日志会发现一个反复出现的超时后竞态:客户端发起支付请求,API 服务器向外发出 HTTP 请求,外部 PSP 在自己的账本上已经成功执行了交易,但响应回传途中出现瞬时断网或丢包,API 服务器于是触发网关超时(如 504 Gateway Timeout 或 socket 读超时)。


客户端应用,或者上游带重试机制的指数退避 worker,会把它当成未处理失败,立刻用完全相同的参数再发一次请求。此时第一次请求可能还在途中,也可能已在后台完成,服务器收到重试后又起一个线程或进程,把同一笔支付再处理一遍。

要防住重复扣款,光在事后拒绝相同交易不够。架构上需要一个原子的、在途状态检测机制,在并发或重复请求进来的瞬间就拦截并限流。

两道防线:请求身份与并发控制

跨分布式节点防重复执行,设计压在两根柱子上。第一根是严格的请求身份,也就是幂等键:不只依赖客户端传来的 transaction_id,而是对规范化后的请求载荷计算 SHA-256 摘要,再与交易标识拼接。这样能防篡改、防载荷不匹配,也防在不同变更之间被无意复用。

第二根是两层并发控制。用 Redis 的 SETNX 加有界 TTL 做内存级高吞吐分布式锁,在边缘吸收流量尖峰、挡掉冗余重试;后面再由持久化层(RDB)兜底,用数据库级 UNIQUE 约束守住账本完整性的最后一道关。

请求进来后的顺序是:先做高速反序列化和 Pydantic 校验,生成幂等键(交易 ID 加 SHA-256 摘要),再向 Redis 申请锁。拿到锁的初始请求继续调用外部 PSP,返回 200 后释放锁;锁冲突的重复或并发重试则直接收到 409 Conflict,被判定为重复请求。

TTL 怎么定,决定锁是救命还是添乱

分布式锁的租约时长要平衡两个相反的风险。TTL 太短:上游 PSP 处理延迟拉长,锁在线程还在等响应时就过期,并发重试拿到新锁,直接导致重复扣款。TTL 太长:处理节点在释放互斥锁前非正常崩溃,后续合法的客户端重试会被锁在死锁状态里,直到 TTL 走完。

实践中的算法是:锁 TTL 等于外部 HTTP 客户端超时,加上时钟漂移余量,再加宽限期。下游 PSP 读超时配置为 15 秒的支付集成,分布式锁 TTL 一般落在 20 到 30 秒之间。

Redis 在这里的角色是低延迟的内存过滤器,在重试风暴打满数据库连接池之前把它们吸收掉。但内存型分布式系统会遭遇故障切换、异步复制延迟,以及集群拓扑变动时的潜在数据丢失。所以绝对一致性要求持久存储层(如 PostgreSQL 或 MySQL)对 transaction_id 或幂等键建立严格的 UNIQUE 索引约束。一旦 Redis 出现意外的脑裂,数据库事务会以完整性违规错误干净地拒绝这次并发执行,保住整条基础设施上的财务账本正确性。

示例代码把这条链路串了起来:orjson 优先、标准 json 兜底的高速序列化,Pydantic v2 的严格模式校验,以及一个模拟 Redis 原子语义(SETNX 加 TTL 过期)的内存幂等协调器。首次请求返回成功,紧接着的重复请求返回冲突,交易不会被二次执行。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

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.

相关推荐
热点推荐
拖了这么久,访华行程终于敲定!中方仁至义尽,高市或成最大输家

拖了这么久,访华行程终于敲定!中方仁至义尽,高市或成最大输家

兵卒史
2026-10-27 18:32:42
难得!凯恩拿金球后在伦敦最贵夜店狂欢至凌晨 但妻子弟弟都在场

难得!凯恩拿金球后在伦敦最贵夜店狂欢至凌晨 但妻子弟弟都在场

雪狼侃体育
2026-10-28 15:50:27
在奥斯卡打了别人一巴掌后,威尔·史密斯的艰难复出之路

在奥斯卡打了别人一巴掌后,威尔·史密斯的艰难复出之路

i书与房
2026-10-27 08:38:08
大一女生穿“洛丽塔”报到,本以为能惊艳全场,没想到连行李都没人愿意帮忙搬

大一女生穿“洛丽塔”报到,本以为能惊艳全场,没想到连行李都没人愿意帮忙搬

妍妍教育日记
2026-08-23 10:10:12
男子借助AI编写彩票选号小程序 幸运猜中508万大奖

男子借助AI编写彩票选号小程序 幸运猜中508万大奖

快科技
2026-10-28 16:38:11
不可思议!杭州拱墅招18名社工,3900人报名:3名博士、400多名硕士,浙大30余人投递简历

不可思议!杭州拱墅招18名社工,3900人报名:3名博士、400多名硕士,浙大30余人投递简历

火山詩话
2026-10-27 10:46:05
央视又出重磅!广电特批60集,凭什么让观众提前一年开始等

央视又出重磅!广电特批60集,凭什么让观众提前一年开始等

手工制作阿歼
2026-10-28 00:31:45
今晚开播,江苏卫视黄金档又一悬疑大剧来袭!戏骨扎堆,值得一看

今晚开播,江苏卫视黄金档又一悬疑大剧来袭!戏骨扎堆,值得一看

情感大头说说
2026-10-28 17:06:22
终于知道红薯为什么不能主粮化了,网友道出真相引万人共鸣!

终于知道红薯为什么不能主粮化了,网友道出真相引万人共鸣!

另子维爱读史
2026-10-26 21:20:02
人情薄如纸,河南女子在浙江被朋友做局欠下220万,债务逾期后,亲戚朋友全部远离,如今无家可归

人情薄如纸,河南女子在浙江被朋友做局欠下220万,债务逾期后,亲戚朋友全部远离,如今无家可归

捣蛋窝
2026-10-20 08:56:07
19岁巴西外援私信辱华:谁想当中国人?只为来捞金,如今下场凉凉

19岁巴西外援私信辱华:谁想当中国人?只为来捞金,如今下场凉凉

包饺子ai剪辑
2026-10-22 09:17:36
罗布泊氢弹试爆取得成功之后,五角大楼数十年追查泄密内奸,最后才发现泄密源头是一个出乎意料的漏洞

罗布泊氢弹试爆取得成功之后,五角大楼数十年追查泄密内奸,最后才发现泄密源头是一个出乎意料的漏洞

唠叨说历史
2026-10-28 11:51:19
反诈博主“徽剑”遭买凶杀害,好友追忆:他经营教培公司,出于正义感反诈

反诈博主“徽剑”遭买凶杀害,好友追忆:他经营教培公司,出于正义感反诈

澎湃新闻
2026-10-28 13:54:06
不查不知道一查吓一跳!44岁一家人住北京豪宅的陈婷,私下有多壕

不查不知道一查吓一跳!44岁一家人住北京豪宅的陈婷,私下有多壕

冷紫葉
2026-09-19 12:41:16
为什么美国壮年男性宁愿躺平也不去工作?

为什么美国壮年男性宁愿躺平也不去工作?

小眼睛小世界
2026-10-28 04:26:41
追溯倒查三年!高校横向项目迎来“大清查”,有些人该怕了!

追溯倒查三年!高校横向项目迎来“大清查”,有些人该怕了!

细说职场
2026-10-28 11:23:35
各国元首任期分别是多少年?不同国家的任期规定有何不同?一篇文章看懂各国任期区别

各国元首任期分别是多少年?不同国家的任期规定有何不同?一篇文章看懂各国任期区别

z千年历史老号
2026-10-08 18:09:35
任泉与李冰冰现身大学,她把头靠在他的肩膀上,二人看起来好亲密

任泉与李冰冰现身大学,她把头靠在他的肩膀上,二人看起来好亲密

旧时光老师
2026-10-26 21:22:09
普京获悉噩耗,在欧洲亲密国家变天了,于是大批俄军开始集结备战

普京获悉噩耗,在欧洲亲密国家变天了,于是大批俄军开始集结备战

果妈聊娱乐
2026-10-27 11:10:19
歼20隐身突袭美军航母编队,遭4架F35、2架F22拦截【空战模拟】

歼20隐身突袭美军航母编队,遭4架F35、2架F22拦截【空战模拟】

军武咖
2026-10-27 12:31:37
2026-10-28 20:47:00
算力游侠
算力游侠
游走在API与报错之间,用魔法(AI)打败魔法的非硬核玩家。
197文章数 101关注度
往期回顾 全部

科技要闻

宇树科技前三季净利暴增270%

头条要闻

演员董勇车险续保被卡维权 吐槽太平洋保险"店大欺客"

头条要闻

演员董勇车险续保被卡维权 吐槽太平洋保险"店大欺客"

体育要闻

0胜4负与篮网国王一桌 热火字母哥赌错了?

娱乐要闻

巾帼不让须眉!章子怡拿下重磅荣誉

财经要闻

iPhone Duo七年等来一场吐槽大会

汽车要闻

搭宁德时代电池 奔腾小马五门版上市权益价3.99万起

态度原创

教育
时尚
亲子
本地
健康

教育要闻

人文引领,实践育人,创新共研国情研学新路径!2026年实践育人高质量发展暨国情研学实践教育研讨会在威海举办。#最威海是环翠 #千里山海文明威海 #观威海

教你把去年的毛衣,穿出今年的好看

亲子要闻

工程车小故事:弟弟受伤了

本地新闻

十月奔赴迪庆,解锁梅里日照金山

查不出猝死风险?可能是项目没做对

无障碍浏览 进入关怀版