订单交易处理系统, 这个系统分为两大子系统,一是订单服务系统, 二是订单成交后的业务处理(订单,资金处理),即交易服务系统, 其中订单成交涉及到与撮合系统的交互, 整个加起来是交易系统的核心.
系统主要结构如下图所示:
- 订单服务系统
主要是用于处理用户订单操作(下单, 撤单, 订单状态(初始,委托,成交,部分成交,撤单,部分撤单)更新, 历史订单查询, 资金冻结解冻等), 而用户的操作入口又分为client端和api端处理;
当时在设计系统时要求:
下单响应时间短, 单机并发量高; 节点可横向扩容;
我们用到的一些处理方式:
- 订单号预先生产;
- 订单进MQ队列;
- 币种订单相关配置和参数缓存到redis;
- 订单表根据业务分表, 历史订单分表;
- 订单查询优化索引;
- 部分订单查询使用从库;
- 扩容交易对,交易区时进行分库;
交易对表的设计主要有:订单委托表, 交易表, 其他等辅助的配置表; 每个交易对一个库;
- 交易服务系统
订单成交后的业务处理, 主要包含双方交易币种的资金更新, 资金解冻, 资金流水记录, 手续费扣除, 订单状态信息更新(类型,支付等), 成交记录生产, 用户账单流水等.
该系统涉及双方资金操作, 要保证事务处理一致性; 交易已经发生, 不可逆, 即双方的资金必须进行兑换.
- 撮合系统
跟同行交流过, 不同的交易系统根据自己的业务, 体量和技术, 有使用java, go或c++进行开发;
买卖盘通常根据价格优先,时间优先进行撮合.
整个交易系统中撮合系统是内存撮合, 是最高效的, 稳定的, 不能成为瓶颈;