
1) 【一句话结论】
采用微服务拆分业务模块,通过消息队列实现异步数据更新,结合缓存(如Redis)和分布式存储(如ES)提升查询性能,确保系统高可用与低延迟。
2) 【原理/概念讲解】
老师口吻解释关键技术:
3) 【对比与适用场景】
| 架构类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 单体架构 | 所有功能模块集中在一个服务中 | 代码耦合度高,扩展困难 | 小规模系统,开发周期短 | 难以水平扩展,故障影响全局 |
| 微服务架构 | 按业务拆分为独立服务,独立部署 | 代码解耦,独立扩展 | 大规模系统,高并发场景 | 服务间通信复杂,需考虑高可用 |
4) 【示例】
设计一个用户画像查询服务:
GET /api/user/123/profile):
user-behavior)。def get_user_profile(user_id):
cache_data = redis.get(f"user_profile_{user_id}")
if cache_data:
return json.loads(cache_data)
es_data = es.search(index="user_profiles", body={"query": {"term": {"user_id": user_id}}})
if es_data["hits"]["total"]["value"] > 0:
user_doc = es_data["hits"]["hits"][0]["_source"]
redis.set(f"user_profile_{user_id}", json.dumps(user_doc), ex=3600)
return user_doc
return {"error": "user not found"}
def process_behavior_message(message):
user_id = message["user_id"]
new_tag = message["new_tag"]
es.update(index="user_profiles", id=user_id, body={"doc": {"tags": {"add": [new_tag]}}})
redis.delete(f"user_profile_{user_id}")
5) 【面试口播版答案】
(约90秒)
“面试官您好,针对百万级客户实时查询的客户画像服务,我的设计思路是采用微服务拆分+消息队列解耦+缓存+分布式存储的组合方案。首先,将系统拆分为用户画像核心服务(负责数据计算与存储)、查询服务(提供API接口)、消息队列服务(如Kafka)和缓存服务(如Redis)。用户查询时,优先从Redis缓存获取数据,若未命中则从ES(分布式存储)查询,并将结果存入缓存,降低对ES的访问压力。数据更新时,用户行为服务将变更事件推入Kafka,用户画像核心服务消费消息后更新ES数据,并触发缓存失效,保证数据一致性。通过这种设计,实现了高可用(服务独立部署,故障隔离)和低延迟(缓存+异步处理),能够支撑百万级并发查询。”
6) 【追问清单】
7) 【常见坑/雷区】