APP下载

大厂架构:马蜂窝支付中心架构演进(源自马蜂窝支付团队)

消息来源:baojiabao.com 作者: 发布时间:2024-05-14

报价宝综合消息大厂架构:马蜂窝支付中心架构演进(源自马蜂窝支付团队)

为了更好地支援交易业务的快速发展,马蜂窝支付中心从最初只支援基础支付和退款的“刀耕火种”阶段,经历了架构调整的“刮骨疗伤”阶段,完成了到实现综合产品平台形态的“沉淀蓄力”阶段的演进。

目前,马蜂窝支付中心集成了包括基础订单、收银台、路由管理、支付通道、清算核对、报表统计等多种能力,为马蜂窝度假(平台、定制)、交通(机票、火车票、用车)、酒店(开放平台、代理商)等近 20 条业务线提供服务。本文将围绕支付中心整体演变过程中不同阶段的核心部分进行简要介绍。

一、支付中心 1.0

初期为快速响应业务的支付、退款以及一些基础需求,支付中心主要负责接入支付通道(支付宝、微信、连连等),由各业务线分别实现收银台,然后呼叫支付中心进行支付。业务系统、支付中心和第三方通道的互动流程图如下:

各系统互动流程为:

业务线将订单资讯封装后请求到支付中心支付中心对订单资讯简要处理后增加支付资讯请求到第三方支付通道第三方支付通道将支付结果异步回拨到支付中心支付中心将第三方响应的资料简易处理后同步通知到各业务系统业务系统进行逻辑处理、使用者通知及页面跳转等业务发展初期,业务量较小,交易场景也比较单一,这样的设计可以快速响应业务需求,实现功能。但当业务复杂性不断提高,接入的业务也越来越多时,该架构就显得力不从心了。各业务线需要重复开发一些功能,并且支付中心不具备整体管控能力,开发维护成本越来越大。主要的问题包括:

维护成本高:各业务线需单独维护收银台,呼叫支付系统完成支付,需分别保证幂等、安全等问题容灾能力差:所有功能集中在一个大模组里,某个功能出问题,直接影响全部结构不合理:架构单一,不能满足复杂业务场景系统职责乱:收银台维护了收款方式及部分业务路由,缺乏统一的管控为了兼顾对快速发展中的业务的需求响应和系统的高可用性,保证线上服务的质量,我们快速进行了架构调整,开始了向支付中心 2.0 的演进。

二、支付中心 2.0

2.0 架构将各业务的公共交易、支付、财务等沉淀到支付中心,并主要解决了以下三个主要问题:

建立基础订单、支付、财务统一体系,抽象和封装公共处理逻辑,形成统一的基础服务,降低业务的接入成本及重复研发成本;构建安全、稳定、可扩充套件的系统,为业务的快速发展和创新需求提供基础支撑,解决业务“快”和支付“稳”之间的矛盾;沉淀核心交易资料,同时为使用者、商家、财务提供大资料支撑。2.1 核心能力

支付中心 2.0 是整个交易系统快速发展的重要时段。在此过程中,不仅要进行架构的升级,还要保证服务的稳定。

目前支付中心对业务提供的主要能力包括:

平台支付:使用者可以使用微信、支付宝等第三方平台来完成支付快捷支付:使用者提供银行卡资讯,进行便捷支付协议支付:使用者完成授权后,可以在不打断使用者体验的场景下进行便捷支付信用支付:使用者可以选择花呗等分期产品进行透支支付境外支付:使用者可以选择境外支付通道完成境外产品的购买线下支付:使用者可以选择 ToB 通道完成特定场景的支付针对马蜂窝业务的特点,目前支援的核心交易场景包括:

支付和退款:适用于普通商品的购买及退款拆分支付:适用于限额或金额较大场景合单支付:适用于保险等分账到不同收款账号的场景2.2 架构设计

演进过程中,首先是对相对独立,同时作为统一体系基础的闸道器进行模组化。支付闸道器对外抽象出支付、退款、查询这些标准请求,然后在闸道器基础上逐步梳理各支付通道,并逐步抽取出基础订单模组,解耦业务功能与支付功能,同时可支援复杂的业务场景。目前的系统功能整体架构如下:

如图所示,从架构上主要分为三个层次:

**产品层:**组合核心层提供的支付能力,对终端使用者提供收银台、对运营财务人员提供运营财务系统**核心层:**支付中心核心模组,包括基础订单、支付路由、支付通道等**支撑层:**用来支撑整个系统的基础设施,包括监控报警、日志、讯息伫列等2.2.1 产品层

产品层主要包含消费者可见的收银台、支付管理后台和财务核算、对账的财会系统。本文重点介绍收银台的设计思路。

收银台

收银台包含 H5 收银台和 PC 收银台两部分:

移动端:

PC端:

如上图所示,收银台主要由三部分组成:订单基本资讯(含订单号及支付金额)、订单详情(含日期资讯、商品资讯及基础资讯)、支付方式(平台支付、信用支付等)。

由于收银台是整个支付中心面向使用者的唯一入口,使用者体验及安全性至关重要。为同时支援业务个性化和使用者的一致性体验,收银台主要是通过定制化和配置化的方式实现。对业务同学来讲接入也非常简单,仅需通过订单号跳转至收银台页面,后续流程均由支付中心完成。

使用者下单后到达收银台页面,收银台通过订单所属业务线、支付金额、是否合单等资讯,展示可用的支付通道。同时风控系统会从商品、订单、使用者行为等维度进行监控,遮蔽高风险的支付渠道。支付渠道出现故障时可在收银台暂停展示。

(1)定制化

为支援统一收银台下各业务线不同模式、不同展示的特性,使用工厂类继承的模式实现各业务资料及展示样式。收银台主要属性分为展示模组和通道路由,其中重复及预设功能的模组由抽象类用模板的方式实现,子类使用预设方法或者重写父类方法即可达到自定义的实现。收银台展示实现类已经实现了一套预设的收银台,其中包含大多数必须的元件(如倒计时,头部定制,订单详情等)。一般情况下,各个业务线仅需简单新增特定的实现类,即可生成一个清晰又丰富的页面(2)配置化

收银台的配置化主要根据各业务的属性(业务型别、品类等)对后续操作做一定的流程处理配置化,比如:

基于后端路由对收银台展示层做不同的处理,使用者看到的可支援的通道列表(微信、支付宝等),以及排序置顶打标记等满足不同场景、不同业务在同一种支付方式下收款到不同的收款账号根据场景不同,走不同的结算方式,以及结算渠道等2.2.2 核心层

支付中心中的核心模组,包括基础订单、支付路由、支付通道等。

基础订单

基础订单系统是连线交易业务线、支付中心和结算系统的桥梁,实现了业务和支付结算解耦。主要涵盖了业务建立订单、关单、支付、退款、回拨通知等 API 模组。基础资料支援普通支付、合单支付、拆分支付、保险支付等多种场景的支付功能,各个系统的互动流程如下:

目前基础订单系统可支援如下两种特殊场景:

(1)一订单 VS 多商品

建立一个基础订单可以包含 N 个商品(商品资讯包含商品名称、商品 ID、单价、数量、折扣等,订单资讯包含使用者 UID、手机号、支付金额、订单折扣等汇总基础资讯),N 个商品对应 M 个业务子订单 (M≦N),所有业务子订单的业务型别若一样则为普通模式,否则为搭售模式;每个业务订单对应一个对账单元(支付成功后会将支付资讯同步给对账系统),一订单 VS 多商品的创单模式基本支援目前所有场景,包括未来可能的购物车模式。

(2)一订单 VS 多支付单

普通订单使用者选择支付宝、微信等渠道会生成一个支付单;当金额超过 5000 元时可以选择拆分订单金额支付,此时会生成多个支付单;如果下单勾选保险就会走第三方合单支付,会生成两个支付单;同时拆分支付也会导致使用者部分支付或者超额支付,监控会针对异常支付情况进行自动退款;大金额订单有 10% 以上的转换率提升, 一订单 VS 多支付单模型更好的支援了马蜂窝的支付场景。

通道路由管理

通道路由主要包含两方面,一个是业务侧需要控制支付通道,一个是支付侧需要选择支付账户。

(1)支付账户管理

支付建立订单和处理回拨等流程中,需要根据业务型别、支付方式和支付通道确定支付账号,早期版本这个对应关系是通过配置档案维护的。一个业务型别对应多个配置项,每新增一个业务需要增加多个配置,而且随着更多支付通道的接入,新增业务需要配置的资讯也越来越多,不易维护。

经过优化,把现有的配置对应关系放到数据库中,资料表由业务型别、支付方式、支付通道唯一确定一个收款账号,支付账号的具体引数资讯还是放在档案配置中。建立订单时根据业务型别、支付方式、支付通道查询收款账号,把账号资讯记录到支付订单资料表,回拨时直接从订单表查询支付账号。

(2)支付通道管理

目前对接了支付宝、支付宝国际、微信、京东支付、applepay、连连支付、银联 2B 等第三方通道,每一个通道下有多个支付产品。第三方通道的界面形式差异很大,但是都提供下单、退款、查询、支付通知、账单下载等标准功能。支付中心对这些支付通道做了一次封装,用一个抽象类作为基类,使用模版方法设计模式,在基类中定义了一个标准流程,具体的实现在通道各自的实现类中。客户类只需要关心基类的公共方法,和具体通道无关。

2.2.3 支撑层

支撑层包含监控报警、日志管理、加签验签、配置管理、讯息总线等模组。其中日志使用 ELK 进行收集管理,系统配置采用公司自研的分散式配置中心进行管理,讯息总线也是使用公司二次封装的 RabbitMQ 进行讯息分发及消费。

由于支付系统对可用性有极高要求以及支付资料的敏感性,支付中心独立实现了监控报警系统,下面将详细描述该监控报警系统的功能及设计思路。

监控系统

为保证监控的实时性及有效性,监控依赖的资源如数据库必须和业务库要进行隔离(避免鸡蛋放在同一个篮子里)。支付监控系统涵盖了 API 监控、 服务效能监控、数据库监控等,能够提供统一的报警、分析和故障排除能力。从异常资料采集到故障问题主动发现及稳定性趋势分析,为支付体系优化提供资料支撑。

(1)监控后台

后台主要包含监控使用者管理以及监控项建立管理,使用者可以根据需求对应的监控专案,可配置的引数涵盖 API 请求地址、请求方式、可用性、正确性、 响应时间等效能资料以及报警方式和策略;详细配置如下图:

界面监控可以针对固定 host IP 系结以及设定超时时间,监控请求支援 GET、POST 两种方式,POST 方式可以设定固定请求引数辅助,监控频率支援分钟、秒两种级别配置;响应资料模组可以校验 HTTP code 是否异常,配置响应资料型别,比较检测返回 key 值,针对 DB 监控还可以设定 DB 查询超时时间;报警模组目前支援简讯和邮件两种方式,可以设定最小、最大报警阈值,超过最大阈值每隔最大报警数会触发一次报警,规避了故障期间简讯轰炸问题。

(2)监控核心

为了实现最快监控频率 10 秒,同时可以支援成千上万的监控项并行执行,支付监控采用了多程序管理的方式。父程序建立指定数量的子程序,每个子程序完成固定数量的监控任务退出任务,此时父程序实时监控子程序状态并建立新的子程序执行任务;父程序还可以接受外部讯号完成服务重启以及停止,流程如下:

(3)监控报警

执行监控项会根据监控配置进行界面请求以及返回资料分析处理,然后通过 Redis 计数方式按报警策略进行报警通知。日常监控简讯示例:

2.3 实践经验

(1)资料一致性

上文提到,我们采用模组化的方式来解耦业务功能与支付功能。在这个过程中,每引入一个模组就会涉及到系统互动问题,因此最核心的便是资料一致性问题。针对资料一致性问题需要引入事务,实时、延迟校验以及补偿机制保证资料的最终一致性。从架构看是很清晰的,但是对于整个改造过程是艰难的,犹如给飞行的飞机更换发动机,所以我们也把这个过程形容为一个刮骨疗伤的阶段。

(2)稳定性

支付服务都是由第三方支付通道提供的,支付通道存在不稳定性。比如使用者用支付宝支付了一笔订单,由于各种原因,支付中心没有收到支付成功的通知,使用者又用微信再次付款,导致重复支付。

为了解决这个问题,支付中心采用定时扫描的策略,主动发现重复支付单并自动执行退款,不需要人工参与。退款流程中,退款单需要经过申请、稽核、呼叫退款界面等流程,在调界面环节,可能会发生失败。呼叫失败的退款单,会根据退避算法发起重试,逐渐加大重试间隔,直到次数超过限制。失败单数量超过阈值、或者有订单处于失败时间超过阈值时会触发报警。自动处理不了的退款单可以人工检测,或线下退款。

三、总结 & 展望

目前,马蜂窝支付中心已经具备支援多业务、多场景、多支付方式的能力,但想要实现一个真正意义上“百花齐放”的平台,还有很多地方需要改进和完善。

即将到来的支付中心 3.0 将以微服务的思想把单体应用按照业务进行解耦,会逐渐从一个高耦合的单一系统演变为众多子系统组成的高并发、高可用、支援更多交易支付场景的分散式系统。微服务化拆分后,在系统结构上将更加清晰,但对于整体系统的开发管理和维护也将带来更大的挑战。

伴随马蜂窝“内容+交易”的战略升级,支付中心也会探索更多的支付方式和能力,持续为各业务线赋能。

本文作者:马蜂窝电商支付结算团队。

(马蜂窝技术原创内容,转载务必注明出处储存文末二维码图片,谢谢配合。)

本文转载于部落格园;原文:https://www.cnblogs.com/mfwtech/p/11138011.html

2019-07-18 18:04:00

相关文章