GaiaEx AcademyGaiaEx Academy
交易系统的软件工程设计模式
开发者编程12 min read

交易系统的软件工程设计模式

交易所所用的事件溯源、CQRS 与架构模式

分享文章

为什么模式在交易系统中如此重要

金融软件出错的代价很高:重复下单、余额不一致、悄无声息的部分失败。设计模式不是用来摆设的奖杯——它们是针对反复出现的失败模式的应对方案:用事件溯源实现可审计性,用 CQRS 让读取与写入分别独立扩展,用熔断器阻止连锁宕机,用幂等性确保重试不会造成重复交易。

CQRS + event log (conceptual) 写入侧 命令 校验 追加事件 事件日志 不可变 有序 读取侧 投影 缓存 / SQL API 查询 读取方可以稍有延迟;写入方在日志中始终是事实来源。
命令产生事实;消费者据此构建物化视图以实现快速查询。

Pub/Sub 与松耦合

撮合引擎、风险检查和行情发布器之间不应在一团乱麻里互相直接调用。一条发布/订阅总线让撮合引擎只管发出成交,下游服务可以订阅,而无需了解上游的实现细节——但你仍然必须选择投递保证(至少一次 vs 恰好一次)以及供重放使用的保留策略。

熔断器与隔板

熔断器在反复失败后停止调用一个生病的依赖,给它恢复的时间,同时保护你的线程池。隔板隔离资源池,使一个失控的分析任务无法把下单提交饿死。

Circuit breaker states CLOSED 放行调用 失败 OPEN 快速失败 超时 HALF 试探调用 半开状态通过试探来决定是重新关闭还是再次打开。
在失败爆发时跳闸;冷却;在放行全部流量前先用一次调用来测试。

状态机与幂等性

订单和转账有合法的生命周期。把允许的状态转移编码进有限状态机,让非法跳转无法发生。再为客户端请求配上幂等键,这样网络重试就不会创建出重复的有效订单。

撮合引擎:价格-时间优先

中心化交易场所按价格-时间优先,把新进订单与挂在簿上的流动性撮合。链上撮合器(如许多 Layer 1(一层 / 主链)DEX 的设计)必须是确定性的:每个验证者重新执行同一序列,并到达完全相同的状态——GaiaEx 从 Hyperliquid 的规则中继承了这一模型。

务实地采用

不要在第一天就盲目照搬每一个模式。先从清晰的边界、结构化日志,以及围绕资金流动的测试做起。当对账的痛苦出现时再加上事件日志;当外部 API 不稳定时再加上熔断器。模式解决的是真实的擦伤,而不是想象出来的伤。