
1) 【一句话结论】采用微服务拆分+WebSocket实时推送+Kafka异步解耦+Redis缓存+分库分表数据库的架构,通过解耦、缓存、分片和长连接管理,满足高并发、低延迟及数据一致性需求。
2) 【原理/概念讲解】
老师口吻解释关键概念:
3) 【对比与适用场景】
| 架构组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 微服务 | 系统拆分为独立服务(监控、报警、存储),各服务独立部署、扩展 | 模块化、解耦、可独立扩展 | 业务复杂,需按功能拆分 | 服务间通信成本(gRPC比HTTP低延迟,但开发复杂),需设计API |
| WebSocket | 基于HTTP的长连接协议,支持双向实时通信 | 低延迟、长连接、心跳检测 | 实时数据推送(如设备状态、报警信息) | 连接池管理,避免资源耗尽 |
| Kafka | 分布式消息队列,高吞吐、持久化、分区复制 | 解耦、缓冲、实时流处理 | 高并发数据采集、日志、事件驱动 | 分区数/副本因子设计,消费者组管理 |
| Redis | 内存数据库,支持高速读写、缓存、分布式锁 | 低延迟、高并发、缓存 | 热点数据缓存、会话、分布式锁 | 数据易失性,需持久化(RDB/AOF),缓存雪崩需处理 |
| MySQL(分库分表) | 关系型数据库,按维度(设备ID、时间)拆分表/库 | 水平扩展、读写分离 | 大规模历史数据存储 | 分片规则(如Sharding键选择),跨库查询复杂 |
4) 【示例】
实时数据流处理与WebSocket推送示例(伪代码):
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='kafka:9092')
for data in real_time_data:
producer.send('monitor_topic', value=data.encode())
const socket = new WebSocket('ws://ems-server:8080/ws');
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
// 更新设备状态UI
updateDeviceStatus(data);
// 检查故障并触发报警
if (data.fault) {
triggerAlarm(data);
}
};
socket.onopen = () => console.log('WebSocket connected');
from kafka import KafkaConsumer
consumer = KafkaConsumer('monitor_topic', bootstrap_servers='kafka:9092')
for msg in consumer:
data = msg.value.decode()
# 1. 更新Redis缓存(热点数据)
redis.set(f'device_{data.device_id}', data, ex=60)
# 2. 写入数据库(分库分表)
db.insert_monitor_data(data)
# 3. 触发报警(若故障)
if data.fault:
alarm_service.send_alarm(data)
5) 【面试口播版答案】
“面试官您好,针对西固热电EMS系统,我设计的架构核心是微服务拆分+WebSocket实时推送+Kafka异步解耦+Redis缓存+分库分表数据库。具体来说:
6) 【追问清单】
7) 【常见坑/雷区】