External Systems Visual
· · ·
题目进度 0 / 0 ✓ 0
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 |
|---|---|---|---|---|
| IPMP | ODTS→IPMP | XML/HTTP | 转账指令(金额/账户/清算行) | 银行间资金划拨 |
| Cert App | ODTS↔Cert | JSON/HTTP | 签名数据(base64)/证书序列号 | 合同数字签名 |
| Doc Agent | ODTS→Doc | JSON/HTTP | 合同模板ID+填充数据 | 自动生成合同文档 |
| JUMS | ODTS→JUMS | JSON/HTTP | 收件人/模板ID/模板参数 | 邮件/SMS通知 |
| SacAS | ODTS↔SacAS | Protobuf | 报备类型/交易序列号/操作类型 | SAC监管报备 |
| ActiveMQ | AMQ→ODTS | 队列消费 | BFIX/Level1/Snap行情 | 定价与盯市 |
| Pulsar | Pulsar→ODTS | 队列消费 | 限制名单数据 | 合规风控 |
| HCP | ODTS↔HCP | S3 API | 合同PDF/报备XML | 文档存储 |
| SFTP | ODTS↔SFTP | SSH | SBL合同/对冲交易CSV | 文件交换 |
| Fuxi Auth | ODTS→Fuxi | JSON/HTTP | 用户名+密码/token | 统一认证 |
| ODTS→SMTP | SMTP | 邮件正文+附件 | 通知发送 | |
| Redis | ODTS↔Redis | TCP | 缓存键值 | 性能加速 |
| Oracle RDS | ODTS↔DB | JDBC | SQL | 持久化存储 |
图例说明:
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/Snap | EOD 估值在第 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 的三条启示
-
“外部系统”不是别人的事。 上面 6 个 🔴🟠 系统里,有 4 个(Oracle、行情、IPMP、SacAS)一旦失联,ODTS 的承诺(实时交易、T+0 结算、按时报备)就直接违约。做 SLA 谈判时,这些外部系统的可用性要写进 ODTS 自己的 SLA。
-
单点依赖要画出来。 这张图本身就是一张”故障传播图”。每次接入新外部系统时,先问:它挂了,ODTS 哪条业务线断?—— 这正是 50 文档讲 CATS 被放弃时”双系统暴露合并缺口”的同源思考。
-
降级路径决定恢复时间。 Fuxi 挂了能降级本地认证、Redis 挂了能回源 DB——这些”可降级”的系统恢复快;而 Oracle/行情/IPMP 没有等价降级路径,故障恢复时间 = 外部系统自己修好的时间。运维预算应优先投向后者。