
1) 【一句话结论】:设计交易系统API时,需遵循RESTful原则,通过API密钥+HMAC签名认证、令牌桶限流、Redis缓存订单状态,结合CDN/WAF防DDoS,并采用参数化查询防SQL注入、时间戳+nonce防重放,确保安全与性能平衡,核心是“安全认证+限流缓存+防注入重放”的协同设计。
2) 【原理/概念讲解】:
/orders)+ HTTP方法(GET/POST),符合资源操作语义,如POST /orders下单,GET /orders/{id}查询。order:{id}),设置过期时间(如5分钟),减少数据库查询,提升性能。Authorization: Bearer <key>.<signature>),服务器验证签名,确保请求来源可信。3) 【对比与适用场景】:
| 策略/组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 限流算法(令牌桶 vs 漏桶) | 令牌桶:按固定速率生成令牌,请求消耗令牌;漏桶:按固定速率流出请求 | 令牌桶:更灵活,可处理突发流量;漏桶:平滑流量,但响应慢 | 令牌桶:适用于交易系统,应对突发请求;漏桶:适用于实时通信(如视频流) | 令牌桶需配置令牌数、填充速率,漏桶需配置桶容量、流出速率 |
| 缓存策略(内存缓存 vs 分布式缓存) | 内存缓存:如Java的ConcurrentHashMap;分布式缓存:如Redis | 内存缓存:速度极快,但容量小,适合热点数据;分布式缓存:容量大,可扩展,适合高并发 | 订单查询:分布式缓存(Redis),减少数据库压力 | 内存缓存需考虑线程安全,分布式缓存需一致性(如Redis的持久化) |
| 防重放验证 | 时间戳+nonce | 时间戳:验证请求是否在有效时间窗口;nonce:确保请求唯一 | 所有需要防重放的请求(如下单、查询) | 时间窗口需平衡安全与性能,过短影响用户体验,过长易被攻击 |
4) 【示例】(伪代码/请求示例):
下单接口(POST /orders):
请求头:
Authorization: Bearer <api-key>.<signature>
X-Rate-Limit: <remaining> <limit> <reset>
请求体:
{
"symbol": "AAPL",
"quantity": 100,
"price": 150.5,
"side": "buy"
}
服务器处理:
查询订单接口(GET /orders/{id}):
请求头:
Authorization: Bearer <api-key>.<signature>
请求路径:/orders/12345
服务器处理:
5) 【面试口播版答案】:
“面试官您好,设计交易系统API时,我会从安全与性能两方面入手。首先,API设计遵循RESTful原则,资源路径清晰(如/orders),HTTP方法语义明确(POST下单,GET查询)。安全方面,采用API密钥+HMAC签名认证(防止未授权访问),结合时间戳+nonce防重放攻击(确保请求新鲜),用参数化查询防SQL注入(避免数据泄露)。性能优化上,限流用令牌桶算法(控制请求速率,避免DDoS),缓存用Redis缓存订单状态(减少数据库压力,提升查询速度)。具体来说,下单接口会先验证签名和限流,再检查防重放,最后写入数据库并缓存;查询接口先查缓存,缓存未命中再查数据库并缓存。这样既能保证安全,又能提升系统性能。”
6) 【追问清单】:
/v1/orders),或请求头(如X-API-Version: 1),避免兼容性问题。7) 【常见坑/雷区】: