1. 业务与技术挑战拆解
2. 总体架构(从数据库边界看)
这类平台常见的形态是'交易域在线处理 + 清结算批处理 + 对外渠道接入'三段式组合。站在数据库一侧,关键动作有两个:把写热点和读热点分开,以及把强一致的边界收紧到最小闭环。
- 渠道与终端
- 复制/同步
- 闸机/读卡器
- 接入网关/鉴权限流
- APP/小程序
- 第三方支付渠道
- 交易服务
- 查询服务
- 消息队列
- 清分清算/对账服务
- 核心关系型数据库
- 只读副本/读库
- 分析/报表/数仓
数据库在这里承担三类负载:
- OLTP 核心交易闭环:写入为主,延迟敏感。
- 对账与清算:读写混合,偏批处理与汇总计算。
- 查询与报表:读为主,跨度大、访问模式多样。
工程落地时,一般会把'核心交易库'当作强一致主库来运营,把查询与报表尽可能引到只读副本或分析系统上;对账清算这类波动明显、资源消耗大的任务,则用消息队列与批处理做削峰填谷,尽量别让主库背上不可控的大查询压力。
3. 数据模型:以'不可变流水'为中心
落到数据模型上,我更愿意先把'三句话原则'摆出来:流水尽量不可变、状态可以派生、对账必须可复算。这么做的直接收益是:并发场景下锁冲突更少、一致性风险更可控,后期审计与追溯也更从容。
3.1 流水表(交易事实表)建议
- 主键选取:首选全局唯一 ID,可采用时间/序列/节点关联的方法,这样能令写入更为分散,最好不要将瓶颈集中在单点序列之上。
- 分区策略:按照交易发生的时间执行范围分区,天或者月这样的粒度较为常见,这样做既能关注写入操作,又便于实施历史归档,当业务量极为庞大时,还会加上业务维度的拆分,线路或者渠道之类的。
- 索引策略:应环绕'对账及高频查询的最短路径'创建索引,不可因'可能会查'而盲目创建大量索引,这样做很可能事与愿违。
示例(仅演示结构与思路,字段需按实际口径调整):
CREATE TABLE txn_ledger (
txn_id VARCHAR(32) NOT NULL,
occur_time TIMESTAMP NOT NULL,
card_no VARCHAR(32) NOT NULL,
account_id VARCHAR(32) NOT NULL,
amount_cent BIGINT NOT NULL,
txn_type VARCHAR(16) NOT NULL,
channel_code VARCHAR(16) NOT NULL,
merchant_id () ,
trace_no () ,
status () ,
create_time ,
(txn_id)
);


