支付与我们的生活息息相关,在面试中也经常问到,这是我们就业陪跑训练营中小伙伴总结的文章,和大家分享一下,觉好留赞呦,感谢支持!
(一)支付架构流程
1、网关层
2、 支付处理层
支付处理层是支付中台的核心,负责处理支付请求并与各大支付平台、银行等外部系统进行交互。其功能包括:
- 支付信息校验:验证支付请求的合法性,如订单号、金额、商户信息等。
- 支付请求发起:根据用户的支付方式,调用不同的支付平台API,发起支付请求。
- 支付状态查询:定期或根据需要查询支付状态,确保支付完成。
- 退款与撤单:支持支付的退款操作或撤销未完成的交易。
3、支付服务层
- 多支付渠道集成:如银行卡支付、第三方支付(支付宝、微信支付、PayPal等)、钱包支付、跨境支付等。
- 支付业务逻辑:管理支付流程的业务逻辑,处理支付成功或失败的回调,确保数据的一致性。
- 支付风险控制:通过风险识别和防范系统(如风控引擎、反欺诈机制等)对支付请求进行实时监控,防止欺诈。
4、支付清算层 (Settlement Layer)
支付清算层主要负责交易的结算和资金的转移,确保支付款项最终准确到达商户或用户账户。包括:
- 资金清算:将支付结果与商户账户进行匹配,并进行资金的清算和结算。
- 多币种和跨境支付:支持不同币种的清算,处理跨境支付的汇率转换和结算。
- 账务管理:管理交易的账务流水,生成财务报表,确保资金流的合规性和透明性。
5、支付安全层
支付安全层负责保障支付过程中的安全性,避免用户信息泄露或资金被盗取。主要包括:
- 加密与签名:使用SSL/TLS加密技术和数字签名对支付数据进行加密,防止数据泄露。
- 认证与授权:通过多因素认证(如动态验证码、指纹识别等)和权限控制,确保只有授权的用户和系统才能进行支付操作。
- 反欺诈系统:通过实时监控、交易行为分析、风控规则等手段,防止欺诈行为。
6、日志与监控层 (Logging and Monitoring Layer)
- 交易日志:记录每一笔交易的详细信息,包括支付请求、响应、成功与失败的原因等。
- 实时监控:通过监控系统实时检查支付系统的运行状态,及时发现潜在问题。
- 告警与分析:当发生异常或错误时,自动触发告警,并通过数据分析进行问题排查。
7、数据分析层
- 支付数据分析:通过对交易数据进行分析,帮助商户了解支付渠道、支付方式的使用情况,进行优化。
- 用户行为分析:分析用户的支付习惯和偏好,为市场营销、产品优化等提供数据支持。
- 风控分析:通过分析支付行为,识别潜在的风险点,为风控模型提供数据支持。
8、 外部接口与API层
- 商户接口:为商户提供方便的API接口,方便他们接入支付系统、获取支付状态、发起退款等操作。
- 第三方支付接入:通过开放API与各类第三方支付服务提供商(如支付宝、微信支付等)进行对接。
(二)下面是可能被问到的问题和回答:
这个中台的支付服务请求响应是同步还是异步的?或者是混合模式?
微信小程序支付支付一般采用同步与异步结合的方式。
同步阶段
- 在用户发起支付请求时,小程序调用微信支付API(
wx.requestPayment
)。 微信支付服务会立即返回支付发起结果 success或fail),这些结果反映了支付请求的执行状态:
- 同步成功(支付请求发起成功):表示支付流程已经启动,但支付的最终状态(成功或失败)需要通过后续异步确认。
- 同步失败:如用户取消支付或请求参数错误,立即返回错误信息,用户无需等待。
异步阶段
- 支付的最终结果(成功或失败)通过异步通知 方式发送给商户。
- 商户系统需要实现支付结果的回调接口,接收微信支付服务器推送的支付结果通知。
- 商户可以通过查询订单接口(
orderQuery
)主动确认支付结果。
同步模式适用场景
- 支付请求从发起到返回结果在一次通信中完成,用户实时获得支付状态。
- 适合对即时反馈有高需求的场景。
1、线下支付
- 如扫码支付、NFC支付、刷脸支付。
- 用户支付后需要立刻获得结果,确保交易完成。
- 例:便利店、超市等场景。
2、小额支付
- 如公共交通、共享单车。
- 交易金额低、支付流程简单,实时性是关键。
3、无需复杂处理的场景 :
- 如虚拟物品购买(如游戏内道具、在线充值),支付后直接发货。
异步模式
1、电商大促与高并发场景 :
2、跨境支付
3、大额支付
- 如机票、酒店预订、企业间交易。
- 涉及银行间复杂验证和审批流程,需要异步完成支付确认。
4、分期支付 :
- 如消费贷款、按揭付款。
- 支付状态受审批和验证影响,最终状态需要异步确认。
支付中台的核心功能模块?
一、支付请求处理模块
1、解析支付信息, 如支付金额、支付平台、支付方式、订单编号等。
2、根据支付平台类型,利用工厂模式创建相应的支付处理器,然后调用支付处理器的支付方法发起支付请求,并进行错误处理。
二、支付结果回调处理模块
1、接收回调并验证合法性
2、根据回调结果变更订单的支付状态
三、订单管理模块?
1、负责订单的创建、查询、更新和删除等操作,并将订单信息存储到数据库中。
2、提供订单状态查询接口,负责查询订单状态,在支付结果回调处理时更新订单状态。
四、配置管理模块
1、存放各个平台的配置信息( API 密钥、回调地址、支付参数)
2、提供配置的读取和更新功能
支付对接?
针对微信小程序支付场景
1、商户申请并设置微信支付
- 商户需要先注册微信商户号,并开通微信支付功能。注册时需要提供企业的营业执照、法人身份证、银行账户等信息。
- 登录微信支付商户平台(pay.weixin.qq.com),获取 商户号 和 API密钥 。
- 配置微信小程序的支付相关信息,如在小程序后台配置支付参数,包括商户号和API密钥等。
2、用户发起支付请求
- 用户在小程序中选择商品并提交订单,点击“支付”按钮时,前端会调用小程序支付接口来发起支付请求。
- 小程序调用 wx.requestPayment 接口向后端发起支付请求,后端会向微信支付服务器请求订单信息。
3、后端生成预支付订单
- 后端通过商户号、API密钥以及微信支付相关的支付参数,调用微信支付的统一下单接口(/pay/unifiedorder )来生成预支付订单。
统一下单请求需要提供以下主要参数:
appid
:小程序的 AppID。mch_id
:商户号。nonce_str
:随机字符串。sign
:签名(根据请求的参数生成签名)。body
:商品描述。out_trade_no
:商户订单号。total_fee
:订单总金额(单位为分)。spbill_create_ip
:用户的客户端 IP 地址。notify_url
:支付结果回调 URL。trade_type
:支付类型(JSAPI
表示小程序支付)。
4、前端调用 wx.requestPayment 接口
- 后端返回的预支付信息(包括
prepay_id
)将传递给小程序前端。 - 前端通过 wx.requestPayment 接口调用支付,传入预支付信息(如
timeStamp
、nonceStr
、package
、signType
、paySign
)。 - 前端调用成功后,用户的微信支付界面将弹出,用户可以确认支付。
5、支付结果回调
- 支付成功后,微信支付服务器会向商户的
notify_url
发送支付结果通知。 - 后端接收到支付通知后,验证签名并处理支付结果。如果支付成功,可以进行发货等后续操作。
6、支付结果查询
- 商户可以根据需要通过微信支付的订单查询接口(/pay/orderquery )查询订单支付状态,确认支付是否成功。
注意事项
1、签名验证
- 微信支付的所有请求和返回数据都需要进行签名验证。商户需确保签名算法的正确性,避免支付过程中的数据篡改。
- 需要使用商户号的 API 密钥来生成签名,签名时要确保参数的顺序和编码方式正确。
2、订单号管理
- 商户必须确保每笔订单的订单号唯一。商户订单号(
out_trade_no
)在微信支付系统中是唯一的,且不能重复。 - 订单号应由商户自行生成,建议使用时间戳和随机数等组合来确保唯一性。
3、金额精度
- 微信支付的金额单位为“分”,即传递金额时需要将人民币的元转换为分。
- 例如,用户支付金额为10元,传递的参数应该是1000(10 × 100)。
4、API调用频率限制
- 微信支付的API调用有频率限制,商户在短时间内不能频繁调用某些接口,如统一下单接口、订单查询接口等。商户需要合理规划接口调用频率,避免被微信支付平台限制。
5、支付成功回调处理
- 商户在接收到支付回调时,需要验证支付通知的签名,确保通知来自微信支付服务器。
- 如果支付成功,可以执行后续操作,如发货、提供服务等;如果支付失败,可以进行相应的错误处理。
6、异常支付场景
- 在支付过程中,可能会遇到网络不稳定、支付中断等异常情况,商户需要准备好处理策略,确保用户支付体验顺畅。例如,提供支付结果查询功能或异常订单处理机制。
7、支付成功后的用户体验
- 小程序内的支付界面应简洁清晰,用户确认支付时无需过多操作,避免出现操作复杂导致支付失败的情况。
- 小程序应该提示用户支付成功或失败,并给出后续操作的指引。
8、退款流程
- 如果需要为用户退款,商户可以调用微信支付的退款接口(/secapi/pay/refund )进行退款。
- 退款请求中需要提供原交易的
transaction_id
或out_trade_no
,以及退款金额等信息。
1、发起支付请求时,确保每个支付请求都有一个唯一的标识符,比如 order_id
或者一个专门生成的 transaction_id
,用于标识每次支付请求的唯一性。
2、使用支付请求幂等性接口 :微信支付本身提供了一些接口支持幂等性。例如,当你发起统一下单请求时,可以为每个支付请求生成一个唯一的商户订单号(out_trade_no
)。如果该订单号的支付请求已经存在,微信支付会返回错误提示,商户可以根据此返回值判断是否重复请求。
3、支付请求记录与状态判断 :
在服务端,针对每个支付请求(以 order_id
或 transaction_id
为标识)应该保存支付的状态(例如:待支付、已支付、支付失败、支付处理中等)。在接收到相同的支付请求时,可以根据已保存的状态来判断是否需要重新处理,或者直接返回已经完成的支付状态
- 请求处理步骤:支付请求发起 -> 保存订单状态 -> 请求微信支付接口 -> 等待支付结果回调
- 支付回调处理:接收到支付回调 -> 查询数据库支付状态 -> 如果该订单已经完成支付,返回成功;如果是第一次回调,处理支付成功逻辑。
微信小程序支付场景中我需要手动做幂等性保障和事务处理吗?
幂等性问题的背景
- 在支付过程中,尤其是通过网络请求和异步操作时,可能会发生网络不稳定或者系统重试等问题,导致同一个支付请求被多次提交,或者同一个支付结果被多次处理。
- 微信支付的通知接口(如支付结果回调)也可能会因为网络原因被多次触发,商户需要确保每个支付通知只被处理一次,避免重复操作(例如:重复发货、重复扣款等)。
如何实现幂等性
- 订单号唯一性:商户的订单号
out_trade_no
应该具有唯一性,且在商户系统中不可重复。每笔订单必须有独特的标识,确保系统能够识别和区分不同的交易请求。 支付结果的幂等处理:
- 支付通知处理:微信支付的支付结果回调接口会向商户的
notify_url
发送支付通知,商户需要对每个支付通知的处理进行幂等性保障。一个常见做法是,商户可以记录支付通知的out_trade_no
或transaction_id
,在处理支付通知时,先判断是否已经处理过该通知。如果处理过,直接跳过。 - 数据库冗余检查:在处理支付回调时,商户应首先检查订单的支付状态。如果订单已经支付成功,应该跳过后续的处理。如果未支付成功,则继续执行支付成功后的操作。
- 支付通知处理:微信支付的支付结果回调接口会向商户的
幂等性关键点:
- 在订单创建、支付成功、退款等重要操作中,都需要保证操作的幂等性。即每个操作都只能执行一次,防止重复处理。
- 通过数据库中唯一的标识(如订单号、支付交易号)进行冗余检查,确保同一支付状态的操作只会执行一次。
这个中台支付服务的网络安全是如何保障的?
网络安全防护技术
- 防火墙:通过设置访问规则,阻止未经授权的网络访问,防止外部网络的恶意攻击和非法入侵,只允许合法的网络流量进入中台支付服务系统 。
- 入侵检测与防御系统:实时监测网络中的异常活动和潜在威胁,如恶意软件入侵、黑客攻击等,并及时发出警报和采取相应的防御措施,如阻断攻击源、隔离受感染的设备等,以保护支付系统的安全.
- VPN(虚拟专用网络):为远程访问中台支付服务的用户或分支机构提供安全的加密通道,确保数据在传输过程中的保密性和完整性,防止数据被窃取或篡改 。
数据加密技术
- 传输加密:采用SSL/TLS等加密协议,对支付数据在网络传输过程中的进行加密处理,使数据以密文形式传输,即使被拦截也难以破解,确保用户的支付信息、账户信息等敏感数据的安全 。
- 存储加密:对存储在数据库中的支付数据进行加密,使用对称加密算法或非对称加密算法,将数据转换为密文形式存储,只有通过授权的密钥才能解密和访问数据,防止数据在存储环节被窃取或泄露.
身份认证与访问控制
- 多因素身份认证:采用多种身份验证方式相结合,如密码、动态口令、指纹识别、面部识别等,增加用户身份认证的安全性,防止账户被盗用和非法登录.
- 访问控制列表(ACL):根据用户的角色和权限,设置详细的访问控制策略,限制不同用户对中台支付服务系统资源的访问权限,确保只有授权用户能够访问和操作相应的功能和数据,防止越权访问和数据泄露.
- 单点登录(SSO):通过单点登录系统,用户只需在一个系统中登录一次,即可访问其他相互信任的关联系统,减少用户在不同系统中重复输入用户名和密码的次数,同时也便于集中管理用户身份和权限,提高安全性和用户体验。
安全审计与监控
- 日志审计:记录中台支付服务系统中的所有操作和事件,包括用户登录、交易记录、系统配置变更等,通过对日志的分析和审计,及时发现异常行为和安全漏洞,为安全事件的追溯和调查提供依据 。
- 实时监控:实时监测支付系统的运行状态、网络流量、交易数据等,通过设定阈值和告警规则,及时发现系统中的异常交易、流量异常、性能问题等,并及时采取相应的措施进行处理,确保支付系统的稳定运行和数据安全 。
- 风险评估与预警:定期对中台支付服务系统进行风险评估,识别潜在的安全风险和威胁,并根据评估结果制定相应的风险应对策略。同时,建立风险预警机制,及时发布安全风险预警信息,提醒相关人员采取防范措施,降低安全风险.
安全管理制度与培训
- 安全策略与制度:制定完善的网络安全策略和管理制度,明确规定支付服务的安全要求、操作流程、人员职责等,规范员工的行为和操作,确保各项安全措施得到有效执行 。
- 人员培训与教育:加强对员工的网络安全培训和教育,提高员工的安全意识和防范技能,使其了解常见的网络安全威胁和防范方法,避免因员工的疏忽或不当操作导致安全事故的发生.
- 应急响应与恢复计划:制定应急预案和灾难恢复计划,明确在发生安全事件时的应急响应流程和责任分工,确保能够快速、有效地应对安全事件,最大限度地减少损失,并在事件处理后能够及时恢复系统的正常运行.
支付服务的服务容错是怎么做的?
事务处理机制
- 原子性保证:采用事务处理机制来确保支付操作的原子性,即一系列相关的支付操作要么全部成功,要么全部失败,避免因为中断或失败导致支付数据不一致的情况。如在数据库操作中,使用事务来包裹支付相关的插入、更新等操作,若其中任何一个操作失败,则整个事务回滚,保证数据的一致性.
- 一致性维护:通过严格的事务控制和数据校验,确保支付系统在各种情况下的数据一致性。例如,在处理支付订单时,不仅要更新订单状态,还要同步更新相关的账户余额、库存等信息,所有这些操作都在一个事务中完成,防止出现数据不一致的问题 。
幂等设计
- 唯一键校验:通过唯一键实现幂等性,防止重复支付或重复退款等问题。如订单侧常见的以订单号关联paymentno做重复支付校验;支付侧交易单以外部单号+商户号为唯一键,支付单以交易单号+操作码作为唯一键.
- 可重入处理:对于已经成功处理的请求,再次接收到相同请求时能够正确识别并直接返回成功结果,而不会重复执行相同的业务逻辑,避免因重试等操作导致的数据重复或状态异常.
重试机制
- 异步重试:当支付请求因网络抖动、服务暂时不可用等原因失败时,将请求放入消息队列(MQ)异步重试,并且重试间隔逐次拉长,以避免对故障服务造成过大压力。例如,第一次重试间隔1分钟,第二次间隔3分钟,第三次间隔5分钟等,直到达到最大重试次数.
- 最大努力通知:采用最大努力通知策略,确保支付结果能够最终准确地通知到相关方。如支付成功后,若通知下游系统失败,会进行多次重试通知,直到下游系统成功接收通知或达到最大重试次数为止.
超时设置
- 接口超时:为所有的支付接口调用设置合理的超时时间,防止请求陷入长期等待,导致整个服务不可用。一旦接口调用超过设定的超时时间,即认为此次调用失败,并根据相应的容错策略进行处理,如重试或快速失败等.
- 全局超时控制:在整个支付业务流程中,设置全局的超时时间,以确保支付操作能够在合理的时间内完成。若超过全局超时时间,系统会自动进行相应的处理,如取消支付、回滚相关操作等,避免因某个环节的长时间阻塞影响用户体验和系统性能 。
限流与过载保护
- 流量限制:通过限制单位时间段内的调用量或系统的并发调用程度,来防止系统在流量高峰期被高流量击垮。常见的限流方式包括固定窗口限流、滑动窗口限流、漏桶算法限流、令牌桶算法限流等,确保系统能够在承受范围内处理支付请求,保障系统的稳定性和可用性.
- 熔断器模式:采用熔断器模式来防止应用程序不断地尝试执行可能会失败的操作。当服务出现故障或调用失败率达到一定阈值时,熔断器会自动打开,暂时切断对该服务的调用,避免因持续请求故障服务导致资源耗尽和系统雪崩。同时,熔断器会定期检查服务是否恢复正常,若恢复则自动关闭,允许再次调用.
舱壁隔离
- 资源隔离:像舱壁一样对资源或失败单元进行隔离,确保一个部分出现问题不会影响到其他部分。例如,在多线程或多进程环境中,为不同的支付业务功能分配独立的线程池或进程,当某个功能出现故障或性能问题时,不会影响到其他正常的业务功能,从而提高系统的整体稳定性和可用性.
- 数据隔离:对不同的支付数据进行分类和隔离存储,防止因数据之间的相互影响导致故障扩散。如将交易数据、账户数据、日志数据等分别存储在不同的数据库或数据表中,并采用适当的访问控制和数据隔离机制,确保数据的安全性和独立性 。
优雅降级
- 功能降级:当支付系统出现问题,如并发量突然增大系统扛不住时,优先保证核心支付功能的正常运行,对一些非核心功能进行降级处理。如关闭支付查询相关入口,减少系统的负载压力,确保支付下单主流程不受影响.
- 数据降级:在系统资源紧张或出现故障时,对支付数据的处理进行适当的降级,以保证系统的基本可用性。例如,暂时降低数据的一致性要求,采用异步方式更新数据,或者返回部分数据而不是完整的数据,待系统恢复正常后再进行数据的同步和补齐 。
数据备份与恢复
- 定期备份:定期对支付数据进行全量备份和增量备份,确保数据的安全性和可恢复性。备份数据可以存储在本地或异地的存储设备中,以防止因自然灾害、硬件故障等原因导致数据丢失.
- 灾难恢复机制:建立完善的灾难恢复机制,当发生重大故障或灾难导致系统数据丢失或损坏时,能够快速地从备份数据中恢复系统的运行。灾难恢复计划应包括数据恢复流程、系统重建步骤、应急响应措施等,确保在最短的时间内恢复支付服务的正常运行.
支付服务是否设计到是分布式事务,如果涉及到是怎么处理的?
支付服务通常会涉及到分布式事务,这是因为支付业务流程往往涉及多个不同的系统或服务,例如支付网关、银行系统、账户系统、订单系统等,这些系统之间需要保证数据的一致性和操作的完整性。以下是一些常见的处理分布式事务的方法:
基于两阶段提交(2PC)协议
- 准备阶段:事务协调者向所有参与者(各个相关系统)发送事务内容,询问是否可以提交事务。参与者执行本地事务操作,但不提交,然后向协调者反馈操作结果(同意或拒绝)。例如,在支付服务中,支付网关完成支付请求处理,账户系统完成资金扣除操作准备,订单系统完成订单状态更新准备,它们都将准备好的结果反馈给协调者。
- 提交阶段:如果协调者收到所有参与者的同意反馈,就会向所有参与者发送提交事务的指令,参与者正式提交本地事务;如果有任何一个参与者反馈拒绝,协调者就会向所有参与者发送回滚事务的指令。这样可以保证要么所有系统都成功完成操作,要么全部回滚,维护了事务的原子性。不过,2PC协议存在同步阻塞(参与者在等待协调者指令时处于阻塞状态)、单点故障(协调者故障可能导致事务阻塞)等问题。
基于补偿机制
- 正向操作:各个系统先执行自己的本地事务,不依赖其他系统的事务结果进行操作。例如,支付服务先进行支付处理,扣除用户账户资金;订单系统同时更新订单状态为“已支付”。
- 补偿事务设计:如果后续发现某个操作出现问题,例如支付成功但订单系统更新失败,就会执行补偿事务。对于上述例子,补偿事务可能是将扣除的资金退回到用户账户,同时更新订单状态为“支付失败”。补偿机制比较灵活,不会像2PC那样导致长时间的阻塞,但要求开发人员精心设计补偿事务,确保能够正确地撤销已经执行的操作。
基于消息队列(MQ)的最终一致性
- 消息生产与发送:当支付操作触发时,将相关的事件消息发送到消息队列。例如,支付成功后,发送一个“支付成功”的消息到MQ。这些消息包含了足够的信息,供下游系统进行后续处理。
- 消息消费与本地事务处理:下游系统(如订单系统、积分系统等)从消息队列中获取消息,然后在本地执行相应的事务处理。以订单系统为例,收到“支付成功”消息后,更新订单状态为“已支付”。如果消息消费过程中本地事务失败,消息队列可以保证消息不会丢失,会在一定条件下重新发送消息给消费者,直到消费成功,从而实现最终一致性。这种方法具有很好的异步性和松耦合性,但可能会存在消息延迟等情况导致数据一致性延迟实现。
分布式事务框架的应用
- DTM框架(Go语言实现):DTM是一款专为分布式事务处理设计的开源框架,在Go语言生态中有着广泛应用,为处理复杂的分布式事务场景提供了有效的解决方案。
TCC模式实现:
- Try阶段:在支付场景下,参与者会执行一些准备操作。比如,支付服务可能会先尝试冻结用户账户中的相应资金,确保这笔资金在后续交易流程中处于暂不可用状态;同时,订单系统可能会预占库存,标记出即将销售出去的商品数量,使其不能再被其他订单占用。这些操作都是在Try阶段完成的初步业务逻辑处理,并且它们的执行结果会被记录下来,以便后续阶段进行判断和处理。
- Confirm阶段:当所有参与分布式事务的各个部分在Try阶段都成功完成了各自的准备操作后,就进入Confirm阶段。此时,支付服务会正式扣除之前冻结的资金,完成资金的实际转移;订单系统则会确认库存的减少,将预占的库存数量从可用库存中真正减掉,完成商品销售环节在库存方面的处理。整个过程确保了所有相关业务操作按照预期有序推进,实现了分布式事务的提交操作。
- Cancel阶段:倘若在Try阶段或者后续的Confirm阶段出现了任何问题,比如支付过程中遇到网络故障导致资金冻结操作未能成功确认,或者订单系统在预占库存后发现商品实际库存不足无法完成销售等情况,就会触发Cancel阶段。在这个阶段,支付服务会解冻之前尝试冻结但未成功确认扣除的资金,使其恢复到可用状态;订单系统也会释放预占的库存,让这些商品重新回到可销售的库存池中。通过这样的取消操作,能够将业务状态回滚到分布式事务发起之前的状态,保证了系统的一致性和稳定性。
SAGA模式实现:
- 正向事务链编排:在支付业务流程中,可能会涉及多个服务的协同操作,形成一个事务链。例如,首先是支付网关接收支付请求并进行初步验证,然后将请求转发给支付服务进行资金处理,接着订单系统根据支付结果更新订单状态,最后可能还涉及到积分系统根据支付情况给用户添加相应积分等操作。这些步骤按照先后顺序构成了一个正向的事务链,每个步骤都作为一个事务步骤在SAGA模式下进行处理。
- 补偿事务设计:当在这个事务链的某个环节出现问题时,就需要进行补偿操作。比如,如果支付服务在处理资金时出现故障导致支付失败,那么就需要设计相应的补偿事务。对于前面提到的事务链,可能的补偿事务包括:支付网关取消对支付请求的初步验证结果记录(如果有相关记录需要清理);支付服务将可能已经扣除的部分资金(如果在故障前已经有部分资金操作)进行回退处理;订单系统将已经更新的订单状态回滚到支付前的状态;积分系统撤销可能已经添加的积分(如果已经添加了积分)。通过这样一系列的补偿事务设计,能够在出现问题时有效地将业务状态回滚到合适的状态,确保系统整体的一致性。
XA模式实现:
- 事务管理器协调:在支付场景应用XA模式时,会有一个事务管理器来负责协调各个参与分布式事务的资源管理器(如数据库、消息队列等)。事务管理器会向各个资源管理器发送准备事务的指令,类似于其他分布式事务模式中的准备阶段操作。
- 提交与回滚操作:当所有资源管理器都反馈准备好可以提交事务时,事务管理器会下达提交事务的指令,此时各个资源管理器会正式执行提交操作,完成各自业务数据的更新等操作,就像在其他模式下完成分布式事务的最终提交一样。然而,如果在准备阶段或者其他环节有任何一个资源管理器反馈无法进行提交或者出现故障,事务管理器就会下达回滚事务的指令,使得各个资源管理器将业务数据回滚到事务发起之前的状态,保证了整个分布式事务的原子性和一致性。
DTM框架通过这些不同的分布式事务模式及其具体实现方式,能够很好地处理支付服务以及其他复杂业务场景下的分布式事务问题,同时其基于Go语言实现也使得在Go语言项目中集成和使用更加方便快捷。
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:sf面试群。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。