Learning
VOL. VII · NO. 102 · OTC Derivatives · 19 JUL 2026

External Systems Visual

OTC 衍生品 · 19 JUL 2026 · 9 min read · 1,118 words
· · ·

ODTS 外部系统交互可视化 / External System Interaction Visuals

本文档用 Mermaid 图从多个维度展示 ODTS 与 17 个外部系统的交互关系。 阅读前建议先看 ODTS-43-Communication-Architecture.md 了解通信基座。


1. 系统交互全景图 / System Interaction Map

graph TB
    subgraph Business["业务系统 Business Systems"]
        IPMP["💳 IPMP<br/>资金划拨平台<br/>XML/HTTP"]
        CERT["🔐 Cert App<br/>数字证书服务<br/>HTTP REST"]
        DOC["📄 Doc Agent<br/>文档生成服务<br/>HTTP REST"]
        JUMS["📨 JUMS<br/>通知服务(邮件/SMS)<br/>HTTP REST"]
        SAC["📊 SacAS<br/>SAC监管报备<br/>Protobuf/ACP"]
        FUXI["🔑 Fuxi Auth<br/>统一认证<br/>HTTP REST"]
        EMAIL["✉️ Email<br/>JavaMail SMTP"]
    end

    subgraph MarketData["行情数据 Market Data"]
        AMQ["📡 ActiveMQ<br/>BFIX/Level1/Snap行情<br/>队列消费"]
        PULSAR["⚡ Apache Pulsar<br/>限制名单(Dipper)<br/>消费订阅"]
        KAFKA["📊 Apache Kafka<br/>Dipper数据平台<br/>消费订阅"]
    end

    subgraph Storage["存储与基础设施 Storage & Infra"]
        HCP["🗄️ HCP<br/>对象存储(S3 API)<br/>HTTP"]
        REDIS["⚡ Redis<br/>缓存<br/>TCP"]
        ORACLE["🗃️ Oracle RDS<br/>主数据库<br/>JDBC"]
        SFTP["📁 SFTP<br/>文件传输<br/>SSH"]
    end

    subgraph ACP["内部ACP模块 Internal ACP Modules"]
        GW["🚪 Access Gateway<br/>前端交易网关"]
        BOOK["📝 BookingAS<br/>成交录入"]
        HEDGE["🛡️ HedgingAS<br/>对冲处理"]
        PRICE["💰 PricingAS<br/>定价引擎"]
        RECON["🧮 Reckoning<br/>估值与清算"]
    end

    ODTS["⚙️ ODTS<br/>(edsWeb + Odyssey)"]

    ODTS -->|"MINA+TCP+Protobuf"| GW
    GW -->|"ACP路由"| BOOK
    GW -->|"ACP路由"| HEDGE
    GW -->|"ACP路由"| PRICE
    ODTS -->|"MINA+TCP+Protobuf"| SAC
    ODTS -->|"MINA+TCP+Protobuf"| RECON

    ODTS -->|"REST XML"| IPMP
    ODTS -->|"REST JSON"| CERT
    ODTS -->|"REST JSON"| DOC
    ODTS -->|"REST JSON"| JUMS
    ODTS -->|"REST JSON"| FUXI

    ODTS -->|"消费"| AMQ
    ODTS -->|"消费"| PULSAR
    ODTS -->|"消费"| KAFKA

    ODTS -->|"S3 API"| HCP
    ODTS -->|"文件上传/下载"| SFTP
    ODTS -->|"缓存读写"| REDIS
    ODTS -->|"JDBC"| ORACLE
    ODTS -->|"SMTP"| EMAIL

    style ODTS fill:#1a73e8,color:#fff,stroke:#0d47a1
    style Business fill:#e8f5e9,stroke:#2e7d32
    style MarketData fill:#fff3e0,stroke:#e65100
    style Storage fill:#f3e5f5,stroke:#6a1b9a
    style ACP fill:#e1f5fe,stroke:#0277bd

2. 业务系统 vs 技术系统划分 / Business vs Technical Systems

quadrantChart
    title ODTS 外部系统分类: 业务价值 vs 技术深度
    x-axis "低技术深度 Low Tech Depth" --> "高技术深度 High Tech Depth"
    y-axis "低业务价值 Low Business Value" --> "高业务价值 High Business Value"
    quadrant-1 "核心业务系统 Core Business"
    quadrant-2 "基础设施 Infrastructure"
    quadrant-3 "低影响工具 Low Impact"
    quadrant-4 "技术支撑 Technical Support"
    IPMP: [0.85, 0.90]
    Cert: [0.70, 0.75]
    DocAgent: [0.60, 0.65]
    JUMS: [0.50, 0.40]
    SacAS: [0.90, 0.85]
    ACP-Modules: [0.95, 0.95]
    ActiveMQ: [0.30, 0.80]
    Pulsar: [0.25, 0.85]
    HCP: [0.15, 0.70]
    Redis: [0.10, 0.60]
    Oracle: [0.45, 0.90]
    SFTP: [0.35, 0.50]
    FuxiAuth: [0.55, 0.30]
    Email: [0.20, 0.20]

3. 资金划拨时序图 / Money Transfer via IPMP

sequenceDiagram
    participant User as 交易员 Trader
    participant ODTS as ODTS edsWeb
    participant CASH as Odyssey Cash Manager
    participant IPMP as IPMP 资金平台
    participant BANK as 银行 Bank

    User->>ODTS: 发起资金划拨申请
    ODTS->>ODTS: 校验额度/风控
    ODTS->>CASH: 转发划拨请求 (REST)
    CASH->>CASH: 构建XML报文
    CASH->>IPMP: POST /ipmp/login (userCode, token)
    IPMP-->>CASH: sessionId
    CASH->>IPMP: POST /ipmp/message (XML封包)
    Note over CASH,IPMP: 报文包含: ftOrderNo, amount, currency,<br/>orderingCustomer(BankCode+Account),<br/>beneficiaryCustomer, settledAmount.date
    IPMP-->>CASH: relatedReference, queryReference
    CASH->>CASH: 启动轮询 (statusPoll)
    loop 轮询转账状态
        CASH->>IPMP: 查询状态 (queryReference)
        IPMP-->>CASH: 处理中/成功/失败
    end
    IPMP->>BANK: 发起跨行转账
    BANK-->>IPMP: 转账结果
    IPMP-->>CASH: instructionStatus=SUCCESS
    Note over CASH,IPMP: successAmount, failureAmount,<br/>unknownAmount, successTime
    CASH-->>ODTS: 通知结果
    ODTS-->>User: 显示转账完成

4. SAC 监管报备时序图 / SAC Regulatory Reporting

sequenceDiagram
    participant User as 交易员/合规 Trader/Compliance
    participant ODTS as ODTS edsWeb
    participant SAC as SacAS (ACP模块)
    participant REG as 中国证券业协会 SAC Portal
    participant HCP as HCP 对象存储

    User->>ODTS: 选择报备交易 (busiDataSeqs)
    ODTS->>ODTS: 组装 SacReportBean
    Note over ODTS: reportType(月报/季报/年报),<br/>tradeDate, deskEntityId,<br/>optType(增/删/改)
    ODTS->>SAC: ACP Protobuf 发送报备请求
    SAC->>SAC: 生成报备XML文件
    SAC->>HCP: 存储XML副本
    SAC->>REG: 提交监管报备
    REG-->>SAC: 返回报备编号
    SAC-->>ODTS: ACP Response (responseDetailIds)
    ODTS-->>User: 显示报备结果 + 序列号
    Note over User,ODTS: 支持批量报备 (reqs字段)<br/>支持导出Excel (sacReportExportMap)

5. 合同数字签署时序图 / Contract Digital Signing

sequenceDiagram
    participant User as 交易员 Trader
    participant ODTS as ODTS edsWeb
    participant CERT as Cert App 数字证书
    participant DOC as Doc Agent 文档生成
    participant HCP as HCP 对象存储

    User->>ODTS: 请求签署合同
    ODTS->>CERT: GET /cert/sendSMS (usage=contract/sign, mobile)
    CERT-->>ODTS: 验证码已发送
    ODTS-->>User: 请输入短信验证码
    User->>ODTS: 输入验证码
    ODTS->>CERT: GET /cert/getDataToSign (contractId, companyId)
    CERT-->>ODTS: DataToSign JSON
    Note over CERT,ODTS: signatureId, dataToSign(base64),<br/>certSn, digestAlg, signingTime
    ODTS->>ODTS: 前端用证书私钥签名
    ODTS->>CERT: POST 提交签名后数据
    CERT-->>ODTS: 验证签名成功
    ODTS->>DOC: 请求生成正式合同文档
    DOC-->>ODTS: 返回合同PDF/Word
    ODTS->>HCP: 存储签署合同
    ODTS-->>User: 合同签署完成

6. 行情数据流时序图 / Market Data Flow

sequenceDiagram
    participant AMQ as ActiveMQ 行情队列
    participant ODTS as ODTS edsWeb
    participant PRICE as PricingAS (ACP)
    participant TRADER as 交易员

    par BFIX 定盘价
        AMQ->>ODTS: BFIX Fixing (每日17:00)
        Note over AMQ,ODTS: 货币对 + 定盘价
        ODTS->>PRICE: 更新定价参数
    and Level1 快照行情
        AMQ->>ODTS: Level1 Quotes (实时)
        Note over AMQ,ODTS: 最新价, 涨跌幅, 成交量
    and Snap 快照
        AMQ->>ODTS: Snap Quotes (间隔推送)
    end

    Note over ODTS: 行情数据存入DB/Redis
    
    TRADER->>ODTS: 查看盯市/估值
    ODTS->>PRICE: ACP 请求定价
    PRICE-->>ODTS: 返回估值结果
    ODTS-->>TRADER: 显示估值

7. 内部ACP模块调用时序图 / Internal ACP Module Interaction

sequenceDiagram
    participant FE as 前端 Frontend
    participant GW as Access Gateway
    participant ODTS as ODTS edsWeb
    participant AS as ACP 业务模块
    
    Note over FE,AS: 请求路由示意 (web → ACP)
    
    FE->>GW: HTTP/WebSocket 请求
    GW->>GW: 协议转换 HTTP→ACP MINA
    GW->>AS: 转发请求
    AS-->>GW: 返回结果
    GW-->>FE: 响应

    Note over ODTS,AS: edsWeb 直接调用 ACP 模块
    
    ODTS->>AS: MINA+TCP (DynamicProtoBufClientService)
    Note over ODTS,AS: sendDynamic / sendDynamicAndWait / sendDynamicIms
    AS-->>ODTS: Protobuf Response

    alt 用户同步请求
        ODTS->>AS: sendDynamicAndWait(msg, timeout)
        AS-->>ODTS: 同步返回
    else 后台异步执行
        ODTS->>AS: sendDynamic(msg)
        Note over ODTS,AS: fire-and-forget
    end

8. 系统交互总览表 / Interaction Summary

系统 System方向 Direction协议 Protocol数据内容 Data Content业务目的 Business Purpose
IPMPODTS→IPMPXML/HTTP转账指令(金额/账户/清算行)银行间资金划拨
Cert AppODTS↔CertJSON/HTTP签名数据(base64)/证书序列号合同数字签名
Doc AgentODTS→DocJSON/HTTP合同模板ID+填充数据自动生成合同文档
JUMSODTS→JUMSJSON/HTTP收件人/模板ID/模板参数邮件/SMS通知
SacASODTS↔SacASProtobuf报备类型/交易序列号/操作类型SAC监管报备
ActiveMQAMQ→ODTS队列消费BFIX/Level1/Snap行情定价与盯市
PulsarPulsar→ODTS队列消费限制名单数据合规风控
HCPODTS↔HCPS3 API合同PDF/报备XML文档存储
SFTPODTS↔SFTPSSHSBL合同/对冲交易CSV文件交换
Fuxi AuthODTS→FuxiJSON/HTTP用户名+密码/token统一认证
EmailODTS→SMTPSMTP邮件正文+附件通知发送
RedisODTS↔RedisTCP缓存键值性能加速
Oracle RDSODTS↔DBJDBCSQL持久化存储

图例说明:

  • ODTS 是 edsWeb (Spring MVC monolith) + Odyssey (Spring Boot microservices) 的总称
  • ACP 模块 (BookingAS/HedgingAS/PricingAS/etc.) 虽然是独立进程,但属于内部系统边界内,通过 MINA+TCP+Protobuf 通信
  • 外部系统均通过 ODTS 间接交互,前端 WebSocket 仅做界面推送,不直连外部

业务代价:当这 17 个外部系统挂掉一个,会发生什么?

图里的每一条箭头,都是一条运营依赖链。任何一个外部系统失联,影响的不是”一个功能按钮”,而是对应业务环节的停滞。下面是按”业务后果严重程度”排的爆炸半径:

外部系统挂掉后的直接后果业务影响严重度
Oracle RDS所有交易读写失败交易台全面停摆,等价于”整个 ODTS 宕机”(见 34 文档的盲交易场景)🔴 致命
ActiveMQ(行情)拿不到 BFIX/Level1/SnapEOD 估值在第 1 步失败 → 保证金/MTM 全部滞后(见 10 文档”EOD 失败”)🔴 致命
IPMP(资金划拨)无法发起跨行转账客户资金调拨卡住,T+0 结算承诺无法兑现🔴 致命
SacAS(监管报备)无法提交 SAC 月/季/年报监管报送逾期 → 合规风险 + 潜在罚款(见 38-Regulatory-Reporting)🟠 高
Fuxi Auth(认证)无法登录全员进不了系统,但 Oracle 还在 → 可临时降级到本地认证🟠 高
Cert App(数字证书)无法签署合同新交易确认书签不出 → 合同法律效力待定(见 31/17)🟠 高
Doc Agent(文档)生成不了 PDF/Word确认书、报表产出中断🟡 中
JUMS(通知)收不到邮件/SMS风控警报、保证金催缴通知漏发 → 运营盲区🟡 中
HCP(对象存储)取不到合同/报表文件已签合同无法调阅、EOD 报表存不进(见 58)🟡 中
Pulsar/Kafka(名单/数据)限制名单、Dipper 数据延迟合规名单滞后 → 可能向受限对手方成交🟡 中
Redis(缓存)缓存未命中回源 DB查询变慢但不影响正确性(降级可用)🟢 低

PM/BA 的三条启示

  1. “外部系统”不是别人的事。 上面 6 个 🔴🟠 系统里,有 4 个(Oracle、行情、IPMP、SacAS)一旦失联,ODTS 的承诺(实时交易、T+0 结算、按时报备)就直接违约。做 SLA 谈判时,这些外部系统的可用性要写进 ODTS 自己的 SLA。

  2. 单点依赖要画出来。 这张图本身就是一张”故障传播图”。每次接入新外部系统时,先问:它挂了,ODTS 哪条业务线断?—— 这正是 50 文档讲 CATS 被放弃时”双系统暴露合并缺口”的同源思考。

  3. 降级路径决定恢复时间。 Fuxi 挂了能降级本地认证、Redis 挂了能回源 DB——这些”可降级”的系统恢复快;而 Oracle/行情/IPMP 没有等价降级路径,故障恢复时间 = 外部系统自己修好的时间。运维预算应优先投向后者。