LabHub
学习 学习路径 课程

银行现场的语言

报文可能会到两次

在 LabHub 中继续学习

一句话总结

没有收到响应与没有完成处理是两件不同的事,但发送方无法区分二者,因此重传会造成重复转账——唯一的防范方法就是使用幂等键。

概念图: 发送方没有任何办法区分这两种情况。 · 幂等键(idempotency key) · 原样返回第一次处理的结果。 · 重复转账无法通过对账发现。

为什么需要这些知识

银行之间交换的消息称为报文。一笔账户转账对应一份报文,每份报文都有自己的报文编号。

问题在于:发送报文后没有收到响应。此时发送方只知道一件事——“没有收到响应”。可能是对方根本没有收到,也可能是对方已经接收并处理,只是响应在途中丢失。发送方没有任何办法区分这两种情况。

站在汇款方的角度,如果不重传,客户的转账就会以失败告终。因此必须重传。但如果对方已经处理了第一份报文,同一笔钱就会被转出两次。

它是如何运作的

解决方案是幂等键(idempotency key),即每笔原始交易对应一个标识符。

전문 번호(msg_id)    전송할 때마다 새로 매긴다. 재전송하면 다른 번호가 붙는다.
멱등키(idem_key)     원거래 하나에 하나. 재전송해도 같은 값을 쓴다.

接收方会记住幂等键;已经见过的键再次到达时,不再重复处理,而是原样返回第一次处理的结果。 关键在于不能返回失败,而要再次返回成功响应。如果返回失败,发送方还会继续重传。

幂等键必须设置有效期,因为不可能永久保存。有效期通常设为几天到一个月;如果短于重传窗口,幂等性就会在没有任何提示的情况下失效。

这里有一个 FDE 必须知道的关键事实:重复转账无法通过对账发现。

如果我方发送了两份报文,对方也处理了两次,那么我方总账会留下两笔记录,对方结算文件中也会有两笔。笔数和金额都完全一致,汇总对账会完美通过。

只有一个位置能够发现问题:检查同一个幂等键下是否关联了两份以上的报文。如果说对账问的是“两本账是否一致”,这项查询问的则是“我方账簿内部是否多次发出了同一笔交易”。这是两个完全不同的问题。

在实际工作中会是什么样

第一,不能用对账结果反驳“转账扣了两次”的投诉。 对账一致无法提供任何反证。在按幂等键归组查询之前,不能断言没有发生重复转账。

第二,超时时间过短会增加此类事故。 当对方系统处理时间变长——例如月末批处理重叠,或临近节假日——就会出现大量超时,继而涌入大批重传。因此,重复转账不会零星分布,而会集中发生在特定日期。调查时先观察时间分布,能够更快缩小原因范围。

第三,触发重传的也可能是人。 页面没有响应时,负责人再次点击按钮;批处理判断任务失败后重新发送;监控工具执行重试——这些情况都会产生同样结果。如果没有幂等键,就必须逐一阻止这三种行为,而这是不可能的。

第四,退回多转的部分应作为更正处理,而不是发起一笔新转账。 如果只是把多转的钱反向汇回,总账中会留下三笔转账,却无法判断哪一笔是原始交易、哪一笔是更正。账务侧必须采用反向分录,对外侧则要发送带有原始交易引用的退款报文,才能在日后追踪。

下一次实操要做什么

你将对照我方总账与对方结算文件,并在对账完美通过的状态下,通过幂等键找出重复转账。两个幂等键下关联了五份报文,你需要计算多转的金额。随后确认这笔金额已经直接混入净额结算头寸,因此必须在结算前进行调整。