业务场景中(比如维护系统查询维护负责人姓名),一个列表页面往往要显示几十条数据,每条数据对应一个 maintainer_id。
如果你为每条记录都调用一次用户中心接口,例如:
GET /user-center/api/user/1001
GET /user-center/api/user/1002
GET /user-center/api/user/1003
...
这样就会导致:
- N 次 HTTP 调用(N=列表条数);
- 巨大的网络延迟;
- 用户中心服务压力暴增。
因此,在成熟系统设计中,会定义一种 批量查询接口(Batch API),一次请求就可以查询多个用户信息。
📦 示例:批量查询接口设计
假设我们要查询维护列表中 20 个负责人信息。
前端或调用方只需要调用一次接口:
请求:
POST /user-center/api/users/batch
Content-Type: application/json
{
"ids": [1001, 1002, 1003, 1004, 1005]
}
响应:
{
"data": [
{ "id": 1001, "name": "张三", "dept": "运维部" },
{ "id": 1002, "name": "李四", "dept": "研发部" },
{ "id": 1003, "name": "王五", "dept": "客服部" }
]
}
维护系统拿到结果后,只需在内存中做一次映射:
const userMap = new Map(users.map(u => [u.id, u.name]));
再把 maintainer_id 映射为 name 即可展示。
⚙️ 批量 API 的好处
| 优点 | 说明 |
|---|---|
| ✅ 减少网络开销 | 一次HTTP调用代替多次调用 |
| ✅ 服务端可优化查询 | SELECT * FROM user WHERE id IN (...) |
| ✅ 结果缓存命中率更高 | 常用用户信息更容易批量命中缓存 |
| ✅ 前端逻辑更简单 | 无需多次异步调用或Promise.all |
🧠 架构优化结合点
这个批量 API 通常和你前面提到的 内存缓存或分布式缓存 结合使用:
[HttpPost("users/batch")]
public List<UserBasicInfo> GetUsers([FromBody] long[] ids)
{
return ids.Select(id => _userCache.TryGetValue(id, out var user) ? user : null) .Where(u => u != null) .ToList();
}
- 如果用户中心采用了 内存驻留(Memory Mirror),
那么这个批量 API 的实现非常简单:
直接从内存 HashMap 批量取值即可,平均查询耗时 < 1ms。 - 如果用户中心使用了 Redis 缓存,
可以通过MGET user:1001 user:1002 ...一次批量取回。
📊 性能对比(单页列表20条示例)
| 实现方式 | 调用次数 | 平均响应时间 | 用户中心负载 | 备注 |
|---|---|---|---|---|
| 单用户查询API | 20次 | 400~600ms | 高 | 网络开销大 |
| 批量API + 缓存 | 1次 | 10~30ms | 低 | 推荐 |
| 批量API + 内存镜像 | 1次 | <5ms | 极低 | 最优 |
✅ 总结一句话:
“用户中心批量 API” 是一种为跨系统高频数据关联优化的标准做法,它把“多个用户的查询需求”合并为一次请求,以减少网络和数据库压力,是所有中大型系统中几乎必备的接口。