
1) 【一句话结论】针对大宗能源贸易撮合与结算系统,设计采用微服务架构,结合TiDB分布式数据库、Kafka消息队列、Redis缓存,通过分布式锁保障库存安全、Kafka分区处理百万级订单、双写+补偿机制确保数据一致性,并构建容错与监控体系应对系统故障。
2) 【原理/概念讲解】
系统核心模块及关键技术逻辑如下:
(类比:撮合引擎像“市场交易员”,库存管理像“仓库管理员”,分布式锁是“库存检查的锁,防止超卖;Kafka是“订单缓冲区”,避免单点阻塞。)
3) 【对比与适用场景】
| 特性 | 分布式数据库(TiDB) | 传统关系型数据库(MySQL) | 适用场景 |
|---|---|---|---|
| 写入性能 | 分片/分表,支持百万级并发写入 | 单机写入有限,高并发下易瓶颈 | 大规模高并发写入(订单、库存) |
| 数据一致性 | 最终一致性(事务保证局部一致性) | 强一致性(ACID) | 核心数据(库存、订单) |
| 扩展性 | 水平扩展(增加节点) | 垂直扩展(增加服务器) | 业务持续增长场景 |
| 注意点 | 分片策略影响数据一致性 | 事务简单但扩展性差 | 小规模低并发业务 |
4) 【示例】订单撮合流程伪代码(含分布式锁与Kafka分区):
# 订单提交请求
POST /order
{
"order_id": "ORD-20240401-001",
"product": "原油",
"type": "buy",
"quantity": 1000,
"price": 60.5,
"currency": "USD"
}
# 撮合引擎处理逻辑(含分布式锁)
def match_order(order_id, product, type, quantity, price, currency):
lock_key = f"inventory_lock:{product}"
with redis_lock(lock_key, timeout=10): # 分布式锁,避免超卖
inventory = get_inventory_from_tidb(product) # 数据库查询库存
if inventory < quantity:
return {"status": "库存不足", "message": "当前原油库存不足,无法撮合"}
reduce_inventory(product, quantity) # 数据库更新库存
kafka_producer.send(
topic="inventory_change",
key=product,
value=json.dumps({"product": product, "quantity": -quantity})
) # 记录库存变更到Kafka(分区按商品类型)
update_order_status(order_id, "matched") # 数据库更新订单状态
return {"status": "撮合成功", "message": "订单已撮合,库存已更新"}
(补偿逻辑:若Kafka发送失败,重试机制(指数退避),若重试多次失败,触发异步补偿任务(每5分钟批量处理未成功消息,回滚库存)。)
5) 【面试口播版答案】
面试官您好,针对大宗能源贸易撮合与结算系统,我的设计核心是构建一个高并发、实时、一致性的分布式系统。首先,系统架构上,我们采用微服务拆分,核心模块包括撮合引擎、订单管理、价格服务、结算引擎、库存管理。其中,撮合引擎负责实时匹配买卖订单(遵循价格优先、时间优先原则),价格服务对接实时市场数据源(如原油价格API、外汇汇率API),提供实时价格及汇率信息,结算引擎处理多币种结算(比如USD、CNY),库存管理实时更新大宗能源商品的库存状态(如原油库存减少1000吨)。技术选型上,我们采用TiDB作为分布式数据库,支持百万级并发写入和事务一致性,存储订单、库存等核心数据;Kafka作为消息队列,通过分区策略(按商品类型分区,比如原油分区1,LNG分区2)处理百万级订单,避免单点阻塞;Redis作为缓存,缓存热点价格(如实时原油价格,TTL设为5分钟)和订单状态(如撮合结果),提升响应速度。数据一致性方面,我们采用分布式锁(库存检查时加Redis锁)保障库存安全,同时采用双写+补偿机制:撮合引擎更新订单状态和库存时,同时写入数据库和Kafka,若数据库写入失败,通过Kafka重试或补偿逻辑(异步批量处理,超时重试)保证一致性。对于系统故障,我们设计了服务熔断(订单撮合超时后降级为只读)、消息队列缓冲(订单提交到处理),并引入监控告警(Prometheus+Grafana),实时监控节点状态和性能指标,确保故障快速恢复。比如,订单提交后,系统首先用分布式锁检查库存是否充足,若不足则拒绝撮合并通知用户,避免无效交易;库存减少后,订单撮合失败会触发库存回滚,确保数据一致性。
6) 【追问清单】
7) 【常见坑/雷区】