现货交易主流程
本篇使用 UML 时序图展示请求从哪个系统进入、调用哪个服务和方法,以及同步返回、异步消息和当前源码断点。为了保证可读性,参与系统较多的总流程拆成上下两段。
图例
| 表示方式 | 含义 |
|---|---|
| 实线箭头 | 同步方法调用 |
| 虚线箭头 | 方法响应或处理结果 |
| 开放箭头 | MQ 等异步消息 |
| alt / else | 不同业务分支 |
| opt | 满足条件时才执行 |
| 黄色 Note | 源码断点、边界或联调注意事项 |
当前源码同时存在旧委托链路和撮合侧独立链路。旧委托服务的平台撮合发送代码已被注释,因此时序图明确标记交接断点,不把两套实现描述成已经贯通的一条生产链路。
现货交易总时序
第一段:请求受理与撮合
sequenceDiagram
autonumber
actor Client as 用户 / API / 机器人
participant App as 应用中心<br/>coinex-app
participant Entrust as 委托系统<br/>coinex-entrust
participant Account as 账户系统<br/>coinex-account
participant Match as 撮合系统<br/>coinex-match
Client->>App: 提交下单或撤单请求
App->>Entrust: saveEntrust() / cancelEntrust()
Entrust->>Entrust: 校验、保存并确定交易路由
Entrust->>Account: 冻结或解冻资产
Account-->>Entrust: 返回账户处理结果
Entrust-->>Match: 平台订单撮合交接
Note over Entrust,Match: 旧委托链路的实际发送代码已注释<br/>生产调用关系需要联调确认
Match->>Match: 入簿、撮合或撤销余单
Match-->>Entrust: 订单与成交处理结果
Entrust-->>App: 返回委托结果
App-->>Client: 返回订单状态
第二段:成交落地与行情发布
sequenceDiagram
autonumber
participant Match as 撮合系统<br/>coinex-match
participant Redis as Redis 日志与缓存
participant Move as 异步落地<br/>MoveService
participant DB as 数据库 / 检索存储
participant MQ as 消息队列
participant Market as 行情系统<br/>coinex-market
actor Client as 用户客户端
Match->>Match: 计算成交、手续费和账户变化
Match->>Redis: putLog(账户、委托、成交明细)
Redis-->>Move: 提供待落地数据
Move->>DB: 写入账户、委托和成交记录
DB-->>Move: 返回持久化结果
Match-)MQ: 发布深度与成交消息
MQ-)Market: NEW_DEPTH_MSG / NEW_TRADE_MSG
Market->>Market: 更新深度、Ticker、成交与 K 线
Market-->>Client: HTTP 查询 / WebSocket 推送
1. 下单时序图
sequenceDiagram
autonumber
actor Client as 用户 / API / 机器人
participant App as 应用中心<br/>coinex-app
participant Entrust as 委托系统<br/>coinex-entrust
participant Account as 账户系统<br/>coinex-account
participant Third as 三方交易所
participant Match as 撮合系统<br/>coinex-match
Client->>App: POST saveEntrust
App->>App: 获取登录用户并覆盖 userId / partnerId
App->>Entrust: EntrustApiV1.saveEntrust(request)
Entrust->>Entrust: EntrustCreateServiceV1.saveEntrust()
Entrust->>Entrust: 校验用户、交易对、方向、价格与数量
alt 平台内撮合
Entrust->>Entrust: 保存业务委托
Entrust->>Account: executeUserTotalToFrozenV1()
Account-->>Entrust: 冻结结果
Entrust-->>Match: MatchingEngineService.enterMatching()
Note over Entrust,Match: 当前旧链路的实际撮合发送代码已注释
else 三方交易
Entrust->>Third: market3rdLocalService.createOrder()
Third-->>Entrust: 返回外部订单号
Entrust->>Entrust: 保存本地委托及外部订单关联
Entrust->>Account: 冻结对应资产
Account-->>Entrust: 冻结结果
end
Entrust-->>App: 返回 entrustId / 业务结果
App-->>Client: 返回下单响应
2. 撮合成交流程
sequenceDiagram
autonumber
participant Caller as 撮合调用方<br/>待联调确认
participant Execute as MatchEngineExecuteService
participant Save as SaveOrderHandler
participant Business as MatchingBusinessHandler
participant Book as RBTreeOrderBook
participant Level as PriceLevel
Caller->>Execute: addOrder(MatchingEntrustDTO)
Execute->>Execute: 检查引擎、用户、交易对与重复订单
Execute->>Save: 发布 ADD_ORDER 事件
Save->>Save: 冻结撮合账户并保存委托缓存
Save-->>Execute: BasicFutureCache.setSuccess()
Note over Execute,Save: 同步成功只表示前置处理完成<br/>不表示已经成交或完成持久化
Save->>Business: 继续传递 RequestMatchEvent
Business->>Book: orderBook.enter(order)
Book->>Level: PriceLevel.match()
Level-->>Book: 返回成交量、成交价与剩余量
alt 完全成交
Book-->>Business: 订单全部成交
else 部分成交
Book->>Book: 剩余数量挂入本方订单簿
Book-->>Business: 返回部分成交结果
else 未成交
Book->>Book: 整单进入本方订单簿
Book-->>Business: 返回挂单结果
end
3. 撤单时序图
sequenceDiagram
autonumber
actor Client as 用户 / API
participant App as 应用中心<br/>coinex-app
participant Entrust as 委托系统<br/>coinex-entrust
participant Match as 撮合系统<br/>coinex-match
participant Account as 账户系统
participant Third as 三方交易所
Client->>App: PUT cancelEntrust
App->>Entrust: EntrustApiV1.cancelEntrust(orderId, version)
Entrust->>Entrust: 校验订单归属、版本与当前状态
alt 平台内订单
Entrust-->>Match: cancelOrder(orderId)
Note over Entrust,Match: 旧委托路径的撮合撤单发送同样存在断点
Match->>Match: OrderBook.cancel() 移除未成交余量
Match-->>Account: 释放实际剩余冻结资产
Account-->>Match: 返回解冻结果
else 三方订单
Entrust->>Third: 按外部订单号撤单
Third-->>Entrust: 返回外部订单最终状态
Entrust->>Account: 解冻确认未成交的资产
Account-->>Entrust: 返回解冻结果
end
Entrust->>Entrust: 更新最终撤单状态与撤销量
Entrust-->>App: 返回撤单结果
App-->>Client: 返回订单状态
4. 成交结算时序图
sequenceDiagram
autonumber
participant Level as PriceLevel
participant Account as UserBBAccountCache
participant Redis as RedisManager
participant Move as MoveService
participant DB as 数据库 / 检索存储
participant MQ as 业务消息队列
Level->>Level: 生成买卖双方成交结果
Level->>Account: userEntrustDeal()
Account->>Account: 扣减冻结、增加所得并计算手续费
Account-->>Level: 返回账户处理结果
Level->>Redis: putLog(账户、委托、成交明细)
Redis-->>Move: 提供待迁移记录
Move->>DB: 写入账户、委托和成交数据
DB-->>Move: 返回落地结果
Level-)MQ: ENTRUST_DEAL_NEW / ENTRUST_DEAL_API
Note over Level,DB: 撮合响应、成交完成与数据库落地<br/>是三个不同时间点
5. 订单查询时序图
sequenceDiagram
autonumber
actor Client as 用户 / 管理后台
participant App as 应用中心<br/>coinex-app
participant Entrust as 委托系统<br/>coinex-entrust
participant Cache as 活动订单缓存
participant DB as 历史数据库 / 检索存储
Client->>App: 查询当前委托 / 历史委托 / 成交明细
App->>App: 校验登录用户和查询条件
App->>Entrust: 调用对应委托查询接口
alt 当前委托
Entrust->>Cache: 查询活动订单
Cache-->>Entrust: 返回当前订单状态
else 历史委托或成交明细
Entrust->>DB: 查询历史订单与成交记录
DB-->>Entrust: 返回分页数据
end
Entrust-->>App: 返回状态、成交量、均价和手续费
App-->>Client: 返回查询结果
6. 行情更新时序图
sequenceDiagram
autonumber
participant Match as 撮合系统<br/>coinex-match
participant Queue as 撮合侧消息缓存
participant MQ as 消息队列
participant Depth as EntrustConsumerV1
participant Trade as CompleteOrderConsumerV2
participant Market as 行情缓存与计算
actor Client as 用户客户端
Match->>Queue: sendDepthMsg() / sendTradeMsg()
Queue-)MQ: NEW_DEPTH_MSG / NEW_TRADE_MSG
par 深度消息
MQ-)Depth: 消费 NEW_DEPTH_MSG
Depth->>Market: 更新买卖盘深度
and 成交消息
MQ-)Trade: 消费 NEW_TRADE_MSG
Trade->>Market: 更新逐笔成交、Ticker 与 K 线
end
Client->>Market: HTTP 行情查询
Market-->>Client: 返回深度、成交、Ticker 与 K 线
Market-)Client: WebSocket 行情推送
流程职责速查
| 流程 | 发起方 | 主要参与系统 | 结果 |
|---|---|---|---|
| 下单 | 用户、API、机器人 | 应用中心、委托、账户、撮合或三方交易所 | 拒绝、挂单或成交 |
| 撮合成交 | 撮合调用方 | 撮合入口、事件处理器、订单簿 | 完全成交、部分成交或挂单 |
| 撤单 | 用户、API | 应用中心、委托、撮合、账户 | 移除余单并释放冻结资产 |
| 成交结算 | 撮合引擎 | 撮合账户、Redis、MoveService、数据库 | 账户、订单和成交记录落地 |
| 订单查询 | 用户、管理后台 | 应用中心、委托、缓存、数据库 | 返回订单及成交数据 |
| 行情更新 | 撮合系统 | 消息缓存、MQ、行情消费者 | 更新并推送市场行情 |