为可靠性而生:美国运通如何大规模处理支付

为可靠性而生:美国运通如何大规模处理支付

💡 原文英文,约3100词,阅读约需11分钟。
📝

内容提要

美国运通采用基于单元的架构处理支付,每个单元是包含微服务和数据库的独立完整处理栈。交易通过全局路由器确定性路由至数据所在单元,避免跨单元同步依赖。故障时丢弃部分工作并重启,而非恢复状态,以保持单元隔离。路由器保持简单,数据预分发,确保高可靠性和低延迟。

🔎

延伸解读

单元化架构的核心:故障隔离而非故障预防

美国运通的单元化架构并非为了减少故障发生,而是为了限制故障影响范围。每个单元是独立部署、自包含的完整处理栈,形成单一故障域。当单元内服务失败时,处理会中断并重新路由,而非尝试恢复状态。这种设计承认故障不可避免,但通过隔离确保单个单元故障不会波及其他单元,从而保障整体支付处理的高可用性。

数据本地化策略:推数据还是推交易

为保持单元自足,美国运通对数据采取两种策略:对于不可变或半静态数据(如汇率、商户类别码),预先推送到所有单元,避免事务处理中的跨单元同步调用;对于动态数据(如账户余额),则通过确定性路由将交易路由到数据所在单元。这种“数据推给交易”或“交易推给数据”的权衡,旨在最小化关键路径上的跨单元依赖,同时保证数据一致性。

全局路由器的设计哲学:简单与信任

全局路由器是连接各单元的唯一通道,承担巨大责任,但设计上刻意保持简单:不包含业务逻辑,仅解析必要字段进行路由;依赖最小化,状态不持久化,日志异步且可丢弃。这种“简单到足以信任”的设计,避免了路由器演变为集中式系统,从而维护了单元化架构的独立性。

故障恢复的取舍:丢弃工作而非恢复状态

当单元内服务失败时,美国运通选择丢弃部分完成的工作,在健康单元中重新开始处理,而非恢复状态。这避免了跨单元共享状态带来的同步和一致性问题。虽然重做工作看似浪费,但支付处理时间短,重做成本低,而共享状态可能引入永久的结构性依赖。恢复窗口通过将“不可逆点”尽量后移来扩大,同时利用幂等标识和渐进式流量恢复来确保安全。

Q&A

美国运通在支付处理中采用了什么架构来保证可靠性?

美国运通采用基于单元的架构(cell-based architecture),每个单元是一个包含微服务、数据库、DNS等组件的独立完整处理栈,形成单一故障域,确保故障隔离。

美国运通如何处理动态数据以保证数据本地性?

对于动态数据,美国运通采用确定性路由,将交易路由到数据所在的单元,而不是将数据复制到交易所在的单元,以避免数据同步延迟和一致性问题。

美国运通的全局交易路由器(Global Transaction Router)如何避免成为瓶颈?

路由器保持简单,只做消息解析和路由,不包含业务逻辑;依赖最小化,状态不持久化,日志异步且可丢弃,配置异步加载;多实例多区域并行运行,确保高可用。

当单元内服务失败时,美国运通如何处理进行中的交易?

编排器检测到失败后停止处理,将交易返回给路由器,路由器选择健康单元,交易在健康单元中重新开始,丢弃之前的部分工作,而不是恢复状态,以避免跨单元依赖。

美国运通如何防止重复交易?

每个交易携带唯一标识符,下游系统使用该标识符抑制重复。此外,通过百分比控制的流量转移和限速恢复,避免重复处理。

美国运通在支付处理中如何权衡单元大小?

单元大小需要平衡,不应将整个企业放入一个单元,而应围绕所支持的旅程(如实时支付)划定边界,包含产生即时答案所需的最小组件。

美国运通支付架构中,单元之间如何通信?

单元之间没有直接的同步通信,所有跨单元通信都通过全局事务路由器进行,路由器是单元间唯一的路径,确保单元隔离。

美国运通支付架构有哪些设计权衡?

包括服务重复、日志丢失、全局可见性延迟、交易拒绝等。这些权衡换取了故障隔离和低延迟。

🏷️

标签

➡️

继续阅读