- 总体架构(高层)
客户端层:Web UI(React/Vue)、移动端(iOS/Android)、第三方 API 客户端(REST/WS)。
API 网关:统一入口,做鉴权、限流、路由、灰度。建议 Nginx/Envoy + JWT。
网关服务层(Auth / API):
Auth 服务(登录、2FA、OAuth、API Key)
公共 API(行情、下单、撤单、账户)
WebSocket 服务(行情/逐笔撮合/用户订单推送)
业务服务层(微服务):
撮合引擎(Matching Engine) — 关键且高性能
订单服务 — 订单写入、状态机
账户/余额服务 — 逻辑余额、冻结、可用
结算/清算服务 — 逐笔结算、手续费计算、账务流水
钱包服务 — 链上热/冷钱包管理、签名、广播
风控/风控队列 — 反欺诈、风控策略
KYC/AML 服务 — 用户身份审核、黑名单查詢
后台管理 — 手工结算、提现审核、配置管理
数据与消息层:
消息队列(Kafka/RabbitMQ)— 解耦、异步任务(撮合 -> 账户 -> 钱包)。
缓存(Redis)— 订单薄、行情、会话。
数据库:事务库(Postgres/MySQL) + 审计/分析数据仓库(ClickHouse / BigQuery)。
区块链层:连接节点或第三方服务(Infura/Alchemy / 本地节点)用于链上转账、确认监听。
监控/审计/日志:Prometheus + Grafana、ELK/EFK、报警/审计日志。
图示(逻辑):Client → API Gateway → Auth/API → (via MQ/Redis) → Matching / Order / Account → Wallet → Blockchain
- 关键子系统详细设计 2.1 撮合引擎(核心)
职责:接收限价/市价/IOC等订单,维护订单簿(buy/sell),按价格优先/时间优先匹配,生成成交(trade)事件。
性能目标:延迟 < 1ms(撮合内),吞吐量:可支持数万 TPS(按需)。
实现思路:
使用单机单市场内存撮合(C++/Rust/Go/Java),内存数据结构(跳表/红黑树或堆)维护price level和order queue。
每个交易对独立撮合线程(避免锁竞争)。
成交后同步写入订单服务(通过持久化日志或 MQ),并发送到账务/通知队列。
容错:
定期将撮合快照与 WAL(Write-Ahead-Log)持久化到磁盘。
在重启时回放 WAL 恢复状态。
2.2 订单服务 & 账户服务(重要事务边界)
订单服务:负责订单生命周期管理(新建、部分成交、全部成交、取消、过期),生成事件写入 MQ。
账户/余额服务:
使用逻辑余额模型(available, reserved, total)。
所有资金变动都要写入账务流水表(不可变)。
关键操作(下单占用、成交扣减/入账、提现冻结/释放)要走分布式事务 / 强一致策略:建议使用 乐观锁 + 数据库事务 或 应用层流水 + 幂等设计(所有操作可重放)。
一致性:
建议将撮合和账户之间用 MQ 解耦,但必须保证“最终一致性 + 幂等”与可回溯审计。
对重要路径(如撮合成交后资金结算),使用确认/回执机制:撮合发送成交 -> 账户确认并返回 ack -> 如果长时间无 ack,则进入人工/自动补偿流程。
2.3 钱包服务(热/冷钱包)
热钱包:小额、频繁出入;在线签名、集中管理;
冷钱包:大量资金离线冷存储;
策略:
提现请求先在业务库冻结,然后由后台批量打包并在热钱包中签名和广播。
定期将热钱包余额回补到冷钱包(手动或多签)。
安全:
使用 HSM 或多签(Hardware wallet / Vault / AWS KMS / Hashicorp Vault)做签名密钥管理。
私钥绝不可硬编码或存数据库明文。
链上监控:监听交易确认数并在区块确认达到阈值后标记到账。
2.4 KYC / AML / 风控
KYC:用户注册后提交证件,第三方识别(Onfido/Trulioo)或内部审核。
AML:黑名单地址/身份库,交易行为检测(异常频率、大额、洗钱模式)。
风控策略:
单笔/单日限额、提币冷却、IP冻结、地理位置黑名单。
机器学习或规则引擎识别异常,自动触发人工复查。
2.5 API & WebSocket
REST API:下单、撤单、查询账户、历史订单、行情接口。
WebSocket:
推送:市场深度、成交流、用户订单变动、资产变更。
使用心跳、重连、顺序号机制保证消息不丢失(若丢失可请求快照差分)。
- 数据库与表设计(简化版) 核心表(MySQL/Postgres)
users (id, email, phone, status, kyc_status, created_at)
api_keys (id, user_id, key_hash, scope, created_at)
wallets (id, user_id, currency, total, available, reserved, updated_at)
orders (id, user_id, pair, side, type, price, amount, filled_amount, status, created_at, updated_at)
trades (id, buy_order_id, sell_order_id, price, amount, fee, timestamp)
account_transactions (id, user_id, currency, change, balance_before, balance_after, type, ref_id, created_at)
withdrawals (id, user_id, currency, amount, fee, address, txid, status, created_at)
deposits (id, txid, currency, amount, address, confirmations, status, created_at)
audit_logs (id, user_id, action, payload, created_at)
日志/分析(ClickHouse)
市场行情历史(kline)、撮合吞吐统计、异常交易轨迹。
- API 设计示例(简要)
REST:
POST /api/v1/order — 下单(body: pair, side, type, price, amount, clientOrderId)
POST /api/v1/order/cancel — 撤单(orderId 或 clientOrderId)
GET /api/v1/order/{id} — 订单状态
GET /api/v1/orders — 历史/当前挂单(分页)
GET /api/v1/market/ticker?pair=BTC-USDT
GET /api/v1/market/depth?pair=BTC-USDT&limit=50
POST /api/v1/withdraw — 提币申请(触发风控/人工审核)
WebSocket channels:
market.${pair}.depth — 深度
market.${pair}.trades — 成交流
user.${userId}.order — 用户订单变动
user.${userId}.balance — 资产变更
鉴权:API Key + HMAC 签名(timestamp + endpoint + body),或 OAuth2 + JWT。
- 关键流程(序列概述) 5.1 下单 -> 成交 -> 结算(简化)
客户端调用 POST /order(API 网关验证)→ API 服务写入 orders(状态 PENDING),并把请求推送到 撮合队列(Kafka)。
撮合引擎 从队列拉取订单并在内存订单簿中匹配,生成 trade 事件(包含 buyOrderId, sellOrderId, price, amount, fee)。
撮合引擎将 trade 写回 MQ(trade topic),并写 WAL。
账户服务 监听 trade topic,执行资金变动:减少买家冻结余额、增加买家可用货币、增加卖家法币可用、计算并扣收手续费,写入 account_transactions。账户服务 ack。
API/WebSocket 推送更新给用户(订单状态、余额变化)。
定期批处理汇总手续费给平台收益地址,流水入账。
5.2 提现(提现链上广播)
用户发起提现 → 钱包服务检查余额 + 风控 → 创建提现记录(状态 PENDING)。
人工或自动审核通过后,钱包服务将提现打包到热钱包,签名并广播到链上,记录 txid(状态 BROADCAST)。
链上确认达到 N 个 block 后将提现状态标为 COMPLETED。
- 安全与合规(必做)
私钥管理:HSM 或 Vault;多签;严格隔离热/冷私钥。
运维安全:最小权限、分段网络(VPC、子网)、WAF、入侵检测、端口白名单。
身份安全:强制 2FA、设备指纹、IP/Geo 限制、登录通知。
审计与可追溯:所有资金关联操作都有不可篡改流水并备份到写保护存储。
合规:KYC/AML、交易数据留存、可配合调查的导出功能。
DDOS 防护:Cloudflare / Anti-DDoS + API限流 + IP黑白名单。
代码安全:定期安全审计、第三方依赖扫描、CI/CD 安全门禁。
- 非功能需求 & 性能目标
可用性:核心服务(撮合/账户)目标 99.99%,多区部署 + 自动故障切换。
恢复时间(RTO):撮合服务需尽快恢复(秒级~分钟),并保证事务一致性。
数据保全:定期冷备份、WAL 持久化、跨区域备份。
吞吐:初版可支持数百~上千 TPS;成长路线:垂直优化撮合引擎与分区(多台分市场)。
- 部署 & 运维
容器化:Docker + Kubernetes(K8s),每个交易对可独立部署/横向扩展撮合服务。
CI/CD:流水线(测试、审计、灰度发布)。
监控:Prometheus (metrics)、Grafana(dashboards)、Alertmanager(告警)、ELK(日志)。
SRE 操作:自动扩容、健康检查、混沌测试(Chaos engineering)验证容错。
- 测试策略
单元 + 集成测试:关键路径(撮合->资金结算)强制覆盖。
压力测试:搭建交易回放工具(历史 Tick 回放)做性能评估。
混合回测:模拟用户并发下单/撤单/提现场景,检测一致性与延迟。
安全测试:渗透测试、密钥泄露模拟、入侵检测演练。
- 演进路线(MVP → Production)
MVP(最小可行):
支持 1-3 个交易对、限价/市价订单、REST + WS 基本功能、热/冷钱包基础。
简单 KYC 表单 + 手动审核。
阶段 2:
扩展撮合并发能力、引入 MQ、自动化 KYC、自动提现打包。
加入更细粒度风控与 AML 模块。
阶段 3(成熟):
多区域容灾、HSM 多签、合规审计导出、做市商接口、保险金库、杠杆/合约(如需)。
- 示例技术栈建议
撮合引擎:C++ / Rust / Go(低延迟)
后端微服务:Go / Java / Kotlin / Node.js(Spring Boot)
DB:Postgres 或 MySQL,分析 ClickHouse
缓存:Redis(订阅/发布 & 排队/限速)
MQ:Kafka / RabbitMQ(Kafka 更适合高吞吐)
API 网关:Envoy / Nginx
身份/密钥管理:HashiCorp Vault / AWS KMS / HSM
日志/监控:ELK/EFK、Prometheus、Grafana
- 风险点 & 注意事项(实践经验)
撮合与账务一致性 是最容易出问题的:设计幂等、可回放的成交流水,并实现补偿机制。
私钥泄露 的破坏性最大:把私钥安全放在第一位(多签+HSM)。
性能瓶颈 往往出现在 DB 写入上,考虑异步化和批处理写入流水。
合规风险:不同国家/地区对加密货币监管差别大,需要法律团队支持。
人工审核 在早期不可或缺:防止大量自动化洗钱/攻击。
如果你愿意,我可以继续做下面几件事(选其一或多个直接给出):
用你偏好的语言(比如 Java/Go)写一个撮合引擎的伪代码实现或核心数据结构示例。
给出Order / Trade / AccountTransactions 的 SQL DDL(可直接用于 Postgres/MySQL)。
画一张序列图(文字版)展示从下单到链上提现的完整流程。
提供安全检查清单(checklist),便于上线检查。