「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
介绍
统一变量计算平台,为信贷风控和交易风控,提供高性能、高并发和高可用的一站式变量计算中心,实现变量生命周期管理,降低金融风险,提高服务质量。
- 支持通用算子配置化,支持基于SQL和JAVA衍生算子在线开发和热部署
- 统一变量管理,支持多人协同定义,共享资料库,为各种场景提供变量数据服务
- 实时交易场景支持毫秒级计算
- 支持集成三方数据,如人行等
应用架构
在风控中,主要包含两个部分:策略和变量。如果策略是引擎,变量则是原料。变量的加工又依赖原始数据或者预加工后的粒度数据。完全基于原始数据加工,保证了精度的同时降低了实时性,而基于预加工的变量则保证了实时性,牺牲了一定限度的精度。 为满足两种场景,采用异步非阻塞和同步阻塞两种架构模式。同步阻塞接口实时上送数据,基于粒度进行实时计算;异步非阻塞接口,依赖流式平台或调度平台进行异步上送和加工,基于全量明细或者离线批+实时流进行准实时计算。
架构整体分为三层: 第一层:变量计算中心,实现变量依赖服务调用,完成整体逻辑的计算。也包含非功能性特征,如超时、熔断等 第二层:基础服务层,包含基于JAVA和SQL的衍生算子服务,依赖的事件中心和DATA-API网关服务 第三层:存储层,实时变量的明细存储于redis集群,准实时的明细存储于分布式数据库TIDB。Redis的降级策略可依赖于tidb或者基于分表的mysql。
服务交互图
业务分析师在配置中心进行变量定义、变量开发和服务配置等 变量计算中心接收外部请求,根据输入的场景标识,获取变量依赖树,执行任务,或调用外部接口、或调用算子服务、或被事件驱动拉起任务 将变量计算结果进行输出映射,直接返回或写入中间库表发出事件通知
核心流程图
变量计算发生在变量计算中心,以场景或变量集做为触发驱动,获取相应的变量依赖树,将其转化为任务树,逐级调用。 对于异步任务,在发出调用请求后即可结束,等待异步任务完成后,发出回调事件,唤醒下个节点的任务继续执行。 在变量计算中心,需要实现超时、重试、熔断和降级等高可用特性。
数据架构
海量数据实时计算方案应基于分治思想化整为零。实时流+离线批是基于时间分治,自研变量计算任务基于空间分治。将大数据拆分为小数据 ,将集中式计算拆分为预计算和近端计算,将集中式存储拆分为分散存储,从而加快任务处理和响应速度,提高用户体验
算子与任务
向上简化用户操作,向下沉淀通用逻辑。 将通用性的技术逻辑与差异性的业务逻辑分离,实现了一箭三雕:凸显业务语义 ;复用底层代码;沉淀领域知识。 比如:某账号过去30天平均交易金额;某账号过去30天累计转账次数。业务关注的内容仅如下表,技术则抽象实现了一个预计算的任务和近端计算的算子。 算子和任务屏蔽底层存储的差异性,支持KV存储为主存,关系型存储为备存,实现高可用。基于关系型存储的预计算需要解决并发写带来的更新覆盖问题。
| 事件 | 主维度 | 从维度 | 算子 | 窗口 | 粒度 | 是否包含当前事件 | 自然日 | 默认值 |
|---|---|---|---|---|---|---|---|---|
| Trade(交易) | customerId | Money | 平均 | 30天 | 1天 | 是 | 否 | 无 |
| Transfer(转账) | customerId | Money | 计数 | 30天 | 24小时 | 是 | 是 | 无 |
SQL ON Memory
-
衍生变量 在基于微任务和算子的基础上,实现了变量聚合计算。在变量的基础上,进行衍生,则是基于SQL on Memory,或直接基于SQL on Redis,或基于热部署的JAVA算子来实现。
-
Calcite 基于Calcite进行二次开发,实现on Memory和on Redis,或者直接实现异构数据源查询,如es和mysql,再在内存里进行合并计算。
-
java算子 对基于Calcite二次开发未能覆盖的算子,则通过java算子实现。利用JVM类加载器的特性,打破双亲委派机制,通过反射进行调用。为保证性能,需对class对象进行本地缓存。