Learning
VOL. VII · NO. 37 · OTC Derivatives · 01 JAN 1970

系统架构收口:45+ 项目生态与微服务试错

OTC 衍生品 · 01 JAN 1970 · 7 min read · 1,623 words
· · ·

把前面所有支线(产品/风险/监管)放进同一张系统地图——并看清"为什么迁移这么慢"。

前面八节我们分别看了产品、生命周期、风险、监管。这一节收口:它们跑在什么系统上。核心结论对 PM/BA 极有用——理解架构负债,才能合理评估”为什么改个字段要 3 天""为什么微服务拆不动”

必须记住
ODTS 是围绕一个共享 Oracle 数据库的 45+ 项目生态,由 tradedesign 的 1,709 个 Proto 定义通信契约,有两个给出略微不同答案的定价引擎(hedging-as vs eds-web-app),靠基于文件的集成和 shell 脚本粘在一起。多年微服务迁移进展缓慢——只有 report-processing-service 真正活下来

一、万米高空:两个世界

维度世界 1:hedging-as世界 2:eds-web-app
框架JFinal + Protobuf + 直接 SQLSpring Boot + MyBatis + REST
定位原系统(2016–17),定价/风险/保证金一体新系统,拟取代 hedging-as
优点快、完整、经实战标准框架、易招人、可独立部署
缺点小众框架、原始 SQL、紧耦合、无测试功能不全、迁移 5+ 年未完成
内行才知道
"两个真相":旧引擎(hedging-as)与新引擎(eds-web-app)对同一笔交易给出略不同的 P&L(差 677 元 / 0.05%)。每天累积,且每次询价时交易员与风控"不知道该信哪个"。这就是为什么前面课程反复强调"看代码锚点时要分清是哪个引擎"。

二、共享数据库的惨痛教训(架构负债根源)

业务代价:所有服务读写同一个 Oracle schema。一个服务的 bug 可能损坏另一个服务的数据;schema 变更要协调所有服务;无法独立扩展。

系统锚点(IT 侧)
2019 年事故:eds-web-app 把 EDS_CONTRACT.remarkVARCHAR2(500) 改到 (1000)(界面显示用)。一周后 hedging-as 的 EOD 批处理随机失败——旧 SQL 用 CHAR 截断 remark 到 500 字节,超长插入即异常 → 当天保证金催缴延迟 4 小时。
根因:不是”改字段的人没通知”,而是”两个应用共享同一张表,一个不知道另一个的 SQL 逻辑”。有独立 DB 和服务边界,这个风险不存在。

双线串联
这个事故直接解释了 0002/0005 里"EOD 批处理延迟 → 保证金推迟"的隐式风险来源。前面学的产品/风险/监管流程,都跑在这张共享库上,所以一个字段变更能连锁反应到保证金。

三、协议注册中心 tradedesign

业务:37 个子系统之间的全部通信格式,由 1,709 个 .proto 文件(15,014 commits)定义。“接口先行”在 2015 年很领先。

系统锚点
所有 Java 项目编译时依赖 tradedesign JAR。2021 年某次 proto 字段变更:团队 A 发了新 JAR,团队 B(eds-web-app)没同步 → 旧版反序列化失败 → 交易同步中断 2 天。教训:接口契约没有强制的向前/向后兼容检查,就成了隐式依赖链。2022 年后新项目改用 REST+JSON,tradedesign 历史停在 2022 初。

四、odyssey 微服务:四个试三个死

业务:2022 年起尝试把单体拆微服务。真实结果(用 git 活跃度而非本地陈旧数据判断):

服务周期结果
report-processing-service4 年持续(至 2026-07)✅ 唯一成功(独立子域)
internal-gateway2.5 年2024 年底停
cash-manager-service2 个月未上线(耦合太深)
quotation-service1 commit概念验证
金句
问"这个模块的数据库是不是独立的?业务逻辑是不是独立的?"如果两个都是"否"——那这不叫微服务,这叫"把代码复制到一个新项目"。
cash-manager 3 人 2 个月 30 万投入、0 行进生产:资金管理逻辑与 eds-web-app 的 sblbooking/reckoning 包高度耦合,拆出后发现"没有 eds-web-app 的表什么都做不了"。
odts-linear-web 是务实赢家:Vue3 + AG Grid 换掉旧 JSP 前端,但后端几乎没动——"新前端+旧后端"。

五、理想架构(为什么没做)

API Gateway → 交易/定价/保证金 服务(各自独立 DB)

             事件总线 (Kafka)

         结算/市场数据/报告 服务

收益:每服务独立 DB、事件总线替代文件轮询、单一真相源、实时通知、独立扩展、死信队列。但 35+ 项目重构成本高、业务方不愿资助”无可见功能改进的多年迁移”——所以进展缓慢。report-processing-service 成功恰恰因为它本就是独立子域(报表),不必和单体抢同一张表。

六、测验(Recall 练习)

凭记忆作答,不要回看。每题选项等长,避免暗示。

1

odyssey 微服务尝试中,唯一真正存活的是?

2

"两个引擎两个真相"指的是?

3

2019 年 EOD 中断事故的根因是?

4

tradedesign 定义了多少个 .proto 通信契约文件?

5

最务实成功的现代化尝试是?

6

tradedesign JAR 更新不同步会导致什么问题?

7

微服务迁移成功的关键判断标准是?

8

odts-linear-web 的成功在于?

六、错题本与复习

查看全部错题

本课错题记录

八、延伸阅读(Primary Source)

收口
九节课构成完整双线地图:0001 语汇 → 0002 生命周期 → 0003–0006 四产品 → 0007 风险估值 → 0008 监管主协议 → 0009 架构。建议下一步做综合测验(跨课 Cross-link 题),或按你最薄弱的某节回看 + 写一份学习笔记。

错题追踪 0011 错题本 · Lesson 0009 · 上游 0008 监管报送 · 母文档 ODTS-25 · MISSION: 产品 + IT 双线精通 · 样式 base.css