Tech 导读 本文重点介绍了交易履约订单中心的系统架构设计经验,该架构经过不断的产品迭代,已支撑了京东科技多个交易场景,每年亿级的数据增长。读者可以通过本文了解到一种通过配置化的方式来满足业务诉求的设计思路,在架构设计、数据模型、通用流程设计等方面,有较高的参考价值。
01
概述
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
1.1 交易履约是什么?
首先定义下什么是交易履约,交易履约是在甲乙双方达成交易产生订单后,乙方按照订单条款为甲方提供服务或交付约定物的行为。
1.2 交易履约订单中心是什么系统?
交易履约订单中心为履约行为提供必要的系统能力支撑,交易履约订单中心记录了交易流通的过程和状态,包括交易主体、产品信息、成交金额、计费、支付、业务信息等全流程信息,为上下游提供数据标准化、全集数据查询和串联流程的功能。目前已接入的场景有:京音业绩匹配、交易数据看板、京音线上化结算、 交易流程串联等。目前交易履约订单中心年订单量 1.5 亿+,在电销、企微、金店、开放平台、用户增长等场景下,有效支持了消金、财富、保险、支付、分期商城等各大业务线的线上、线下的业务发展。

图1 交易履约订单中心系统
02
名词解释
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。从设计稿出发,提升页面搭建效率,亟需解决的核心问题有数据来源:交易数据的来源,包含业务信息、联系人、数据接入协议
数据来源:交易数据的来源,包含业务信息、联系人、数据接入协议等。
订单模版:交易履约订单中心采用泛化的格式存储交易数据,针对每个交易场景配置一个订单模版,模版上配置映射规则来解析数据。
跟单:履约订单中心接收满足某些条件的交易数据。
补单:当数据源的数据不完整或不满足业务场景需求,履约订单中心请求外部接口来补充交易数据。
推送模版:履约订单中心将交易数据推送到下游系统。
03
设计实现
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。从设计稿出发,提升页面搭建效率,亟需解决的核心问题有:
3.1 整体架构
整体架构主要分成四个部分(如下图的蓝色部分),依据高内聚、低耦合的设计原则,每个分层只专注处理自己的业务逻辑,分层之间通过 MQ 消息驱动数据流转。
接收层:负责接收上游产品层的交易数据,目前支持 MQ 消息和杰夫接口两种协议。
数据处理层:负责对数据进行解析、幂等判断、交易时序判断、补充数据完整性、映射订单模型等。
数据推送层:负责对数据按照指定的规则格式化、推送到下游系统,目前支持 MQ 和杰夫两种协议。
查询服务:负责数据的查询和导出。

图2 整体架构
3.2 业务接入配置化
经过对整体架构的设计和抽象以后,可以发现各个业务线的数据处理流程具有高度的一致性:数据接收、数据处理、数据推送,而在不同的业务线产品的交易场景下会存在一些特定的差异,比如,只接收满足某些条件的交易数据、金条借款的订单与基金购买的订单模型不同、只有满足某些条件的数据才推送给结算系统等。为了提高业务的接入效率、降低接入成本,可以抽象一套通用的数据处理流程,流程中的分支通过条件表达式来识别,同时提供一套完整的配置化页面供产品和运营同学使用,最终实现了业务接入配置化、自助化,如下图:

图3 实现业务接入的配置化
3.2.1 配置数据来源和订单模版
数据接收层通过配置的数据来源协议编码路由到订单模版,不同的业务产品交易场景会配置不同的订单模版。

图4 关联订单模板
3.2.2 配置模版内容
在数据的处理环节,通过解决不同数据来源的数据解析、模型映射、幂等判断、时序判断等问题,不同来源的差异化通过配置化来支持,如下图所示的配置内容,将要解析的数据配置成 JsonPath,数据处理程序通过读取字段类型是“交易单号”的配置,来解析交易单号并完成幂等判断;通过读取“交易时间”的配置,来解析并完成数据时序的判断。

图5 配置模板内容
Fastjson 1.2.0 之后的版本支持 JSONPath,可以在 java 框架中当作对象查询语言(OQL)来使用。
// 解析贷款单号
Object loanId = JSONPath.extract(jsonStr, "$.jt_df_success.loanId");
// 解析还款单号
Object loanNo = JSONPath.extract(jsonStr, "$.jt_repayment.taskData.loanNo");3.2.3 配置表达式
前面提到过,在通用的数据流程中存在这样的分支流程:当满足一定条件时做某些事情,具体的条件根据业务场景的诉求确定,要做的事情是可以枚举和抽象的,比如过滤订单消息或者调用某个服务等。这种场景类似于一个轻量级的规则引擎,我们通过开源的 MVEL 类库来实现这个表达式引擎(特点:灵活、性能高、无类型限制)。下图所示为一个过滤消息的配置示例:

图6 模板表达式的配置
MVEL 类库在订单中心主要的应用场景是对预配置的表达式进行逻辑运算。
Object result = MVEL.executeExpression("$actExt3$=='SECOBT_JD'&&$accountType$==21", context);3.3 业务交易明细看板配置化
通过提供通用的数据查询接口和通用的查询页面,来满足数据检索的诉求。针对不同业务产品的交易场景,下游系统都有个性化的查询诉求,比如那些字段需要作为查询条件、哪些字段要在列表页展示、哪些字段需要导出等,类似这样的个性化诉求均是通过配置化来支持的,如下图的配置示例所示:

图7 看板配置化
通用的查询页面通过切换业务线来联动更新查询条件和列表字段:

图8 看板效果
3.4 业务数据推送配置化
系统也具备将上游产品层的数据转发给下游系统的能力,目前支持杰夫接口和 MQ 消息两种协议,针对下游接口标准不统一的情况同样通过配置化的方式来支持:

图9 数据推送配置化
下游接口的字段可以灵活配置,推送程序运行时解析推送配置,以交易数据为上下文组装推送参数,泛化调用下游接口。

图10 数据推送配置化
04
未来规划
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
交易履约订单中心经过 2 年的建设与推广使用,已经完成了系统的基本能力建设,通过配置化能满足多数交易场景的数据接入需求。但是对于运营效率提升、数据核对与告警等需求支持的还不完善,为了更好的发挥系统价值,进一步提升运营效率,交易履约订单中心有以下几个方面的规划:
完善配置化功能:优化配置页面交互方式,降低使用门槛、提高运营效率。
提升稳定性:建立熔断机制、应急响应机制等。
提升数字化能力:建设支持更多维度的数据看板、建立数据核对与告警机制。
05
总结
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
本文从交易履约订单中心的建设背景、设计细节、已支撑案例及适用业务场景多个层面,进行了详细介绍。通过本文读者可以学习通过配置化快速支撑业务的系统架构设计经验、表达式引擎的应用场景。读者可以关注本文展示的以配置化的形式,快速支持多方业务数据接入的架构设计经验。