#后端

工程师获得金融科技系统实战指南

Marta Kowalska
Marta Kowalska
1 min read

《金融科技工程手册》为软件团队提供了一份实用路线图,帮助他们构建能够转移、记录和审计资金的系统,同时不引入或丢失任何价值。

《金融科技工程手册》为围绕金钱构建软件的工程师梳理了一套实用模式,涵盖从账本设计和幂等性到 Webhook、对账、访问控制和生产测试。

这本手册面向从其他软件领域加入金融科技的工程师。社交应用可以从重复通知中恢复,但金钱系统不能对重复提现吗、被四舍五入抹掉的费用,或缺失的结算记录耸耸肩了事。该指南围绕三条规则来界定这项工作:不要凭空编造数据,不要丢失数据,不要在未经检查的情况下信任外部或内部系统。

第一课从表示方式开始。金钱需要一个金额和一种货币,并且要以足够精确的方式存储。手册警告不要在金融金额上使用浮点类型,因为常见的解析器和运行时会在一个原本谨慎的系统边缘引入舍入误差。它建议团队根据系统是存储余额、计算费率还是处理加密资产,分别采用固定最小单位、任意精度小数、有理数,或者这些方法的组合。

这种区分很重要。12.34 美元的法币余额,若按 ISO 4217 的货币元数据,可能适合表示为 1,234 美分。某种加密代币可能使用 18 位小数,并且会溢出 64 位整数。如果客户端把原始 JSON 数字解析成 IEEE 754 双精度浮点,一个看似简单的 JSON 数字就可能破坏周密的内部设计。手册推动工程师改为把金额作为字符串或最小单位整数来传输。

指南把舍入视为业务决策,而不是格式化问题。费用计算、货币兑换、利息和费率应用都可能产生系统必须分配的分数。团队需要决定余数归谁或由谁承担,记录残差,并避免在持久化或展示等边界之前就过早舍入。如果平台把一笔付款拆成多个部分,四舍五入后的各部分加总后可能不再等于原始金额。手册敦促团队追踪这个差额,而不是把它掩盖掉。

账本部分构成了这本手册的重心。指南将复式记账解释为一种工程模式:每一次资金流动都会同时贷记一个账户并借记另一个账户,因此金钱既有来源也有去向。外部提供方也有自己的账户。用户余额来自记账分录,而不是可变的余额字段。更正通过新的关联条目完成,而不是直接编辑已过账记录。

这种方法为审计提供了轨迹。金融系统需要解释发生了什么、是谁触发的、系统何时记账、为什么会发生,以及哪些源数据支撑了这个决策。手册将价值时间、记账时间和结算时间分开,因为这些日期回答的是不同的问题。一笔刷卡交易可能发生在周一,进入公司的系统是在周二,而到银行完成结算则是在周五。把这些日期压缩成一个 created_at 字段会丢失团队日后无法重建的事实。

手册也谨慎对待事件溯源。事件溯源可以给团队带来强审计轨迹,因为事件日志会成为派生状态的来源。指南并不把它包装成通用答案。工程师仍然需要投影、快照、模式演进,以及能保存多年历史事件的工具。对于许多周边领域,手册认为,使用带可靠变更日志的传统模型就能满足需求,而且运维成本更低。

执行模式占据了指南的另一大部分。幂等性受到特别关注,因为金融科技系统会按设计进行重试。一次提现请求可能在提供方收到后超时,客户端可能再次重试。服务器必须把这些投递折叠成一次效果。手册倾向于使用明确的幂等键,并将其限定在某个客户端和操作范围内,同时使用能处理两个重复请求同时到达的原子屏障。

资金预留应对的是另一类竞态。在平台把钱转出或调用合规提供方之前,它会先把用户可用余额中所需的金额预留出来。用户仍然拥有这笔资金,但系统会阻止另一笔交易把同一笔钱花掉。指南明确提出一条硬性要求:检查余额并记录预留必须具有强一致性。过时读取可能会让两笔提现都基于同一笔资金通过。

手册并不假装预留能消除透支。外部系统可能因为高于预期的结算、冲正、退单或延迟费用而强制出现负余额。指南警告工程师不要把非负余额编码成无符号类型,或编码成会拒绝现实的数据约束。无法表示负余额的系统可能崩溃、把值截断为零,或者通过错误的修复路径凭空造钱。手册要求团队把透支入账、调查原因,并通过未来存款、偿还或损失账户来恢复。

外部集成同样被不信任对待。支付处理商、银行、托管方、KYC 供应商、AML 供应商、区块链节点以及内部服务都可能返回格式错误的载荷、过时记录、重复消息,或者根本没有响应。手册建议团队验证自己依赖的字段,以可查询形式保存请求和响应,并在流量暴露限制之前先根据供应商配额做一遍粗略估算。

Webhook 的处理态度非常直接。Webhook 应该触发检查,而不是直接确认事实。指南建议对原始字节验证签名,保存原始载荷,快速返回确认,并在请求路径之外处理工作。团队应该查询提供方的 API 获取当前状态,并为永远不会到达的 webhook 构建对账任务。相同事件可能重复到达,也可能乱序到达,因此 webhook 处理器需要幂等性和状态检查。

手册把这种模式与可靠发布联系起来。一个系统如果分开执行“更新数据库”和“发送 Kafka 事件或外发 webhook”这两步,就可能在中间失败。指南将 outbox 模式、变更数据捕获和事件溯源描述为实际可行的答案。像 DebeziumAWS Database Migration ServiceTemporalCamundaAWS Step Functions 这样的工具覆盖了这片领域的部分能力,不过每一种都带有自己的模型和运维负担。

对账是最后的兜底。手册敦促团队将自己的账本与处理商、银行、托管方、区块链以及其他独立来源进行比对。不一致可能意味着数据缺失、金额不同、结算过时,或者批量转账存在一对多映射。指南警告不要为了让报表变绿而覆盖掉某一侧。工程师需要一等公民级别的更正机制、重处理路径,以及尊重结算时序的匹配逻辑。

控制部分把“不信任”的概念扩展到了公司内部的员工和系统。敏感的资金操作、费用变更、生产部署和基础设施变更,可能需要职责分离或 maker-checker 审批。审批本身也需要留痕:申请人、批准人、原因、时间戳,以及同一人未同时扮演两种角色的证据。访问控制也采用同样的处理方式,即最小权限、基于角色的访问、变更轨迹和定期审查。

测试部分以更适合金融状态的技术为手册收尾,而不只是依赖示例式断言。基于属性的测试可以生成操作序列,并在每一步之后断言账目平衡。崩溃注入可以在每两步之间杀死一个长流程,并证明 worker 能够恢复执行。黄金测试可以将费用拆分或对账单固定到经审核的输出。向后兼容测试可以在模式变更后继续保持旧事件载荷可读。

手册的端到端示例把这些模式具体化了。一次加密货币提现结合了幂等提交、资金预留、合规检查、链上广播、确认深度、账本过账、费用结算和链上对账。一次银行卡入金展示了为什么平台应把 capture webhook 视为信号,通过清算账户入账,等待结算,并通过关联冲正来处理退单。一笔应用内兑换加返现的场景则说明了为什么价差、舍入、参考汇率和促销资金都需要账本分录。

该项目没有宣称融资、投资人或商业发布。它的市场定位来自另一个缺口:许多工程师带着扎实的分布式系统技能进入金融科技,却很少接触会计、结算、托管、制裁检查、退单和审计证据。这本手册把这些关切打包成软件模式,而不是金融行话。

这使得这本指南不仅对金融科技初创公司有用。任何存储余额、转移资产、发放促销资金、输出财务报表或与支付提供方集成的团队,都会面临同样的压力。金钱软件会在服务、时间戳、重试和人工覆盖之间的缝隙里失效。手册为工程师提供了描述这些缝隙的词汇,以及一组可以转化为代码的控制手段。

评论

正在加载评论...