现货交易主流程

本篇使用 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、行情消费者 更新并推送市场行情

继续阅读:委托系统 · 撮合系统 · 行情系统 · 三方接入 · 链路断点与联调检查