MDM五十万台设备高并发场景解决方案【后台管理】
单体架构
方案设计
- 终端设备
- 终端将消息发送到 MQTT
- 后台管理
- 消息存储到 Redis:
sn:incr:${sn}
:终端同步到后台管理的增量数据sn:incr:set
:待消费的sn队列sn:detail:${sn}
: 返回给前端的完整数据
- 执行流程:
- 终端将设备增量信息发送到后台
- 后台将数据保存到redis(
sn:incr:${sn}
),同时添加到待消费队列(sn:incr:set
)- 通过
SADD
将设备ID推入队列,通过 `SPOP 消费队列。
- 通过
- 多消费者(线程池):
- 不断循环尝试拉取消费队列(
sn:incr:set
),拉取成功则尝试进行 - 消费失败记录失败日志
- 不断循环尝试拉取消费队列(
-
前端查询
- 从 Redis 查询设备信息:首先从
sn:detail:${sn}
中获取设备信息,如果拿不到则从数据库中获取。然后保存到redis(sn:detail:${sn}
) - 数据一致性检查:与
sn:incr:${sn}
中的时间戳进行比较,- 时间戳一致直接返回
- 时间戳不一致,触发同步操作,更新
sn:detail:${sn}
和数据库,确保拿到的是最新数据。
- 从 Redis 查询设备信息:首先从
架构设计
系统架构图
时序图
微服务架构
方案设计
- 终端设备
- 终端将消息发送到 MQTT
- 后台管理
- 消息存储到 Redis:
sn:incr:${sn}
:终端同步到后台管理的增量数据sn:incr:set
:待消费的sn队列sn:detail:${sn}
: 返回给前端的完整数据
RabbitMQ
处理同步请求:- ` sn:sync:${sn}:设备同步消息(使用发布订阅模式)
- 执行流程:
- 终端将设备增量信息发送到后台
- 后台将数据保存到redis(
sn:incr:${sn}
),然后将同步消息放到RabbitMQ
RabbitMQ
:- 配置
QOS
控制并发处理请求的数量;
- 配置
RabbitMQ消费者
- 开始将数据从
redis
同步到数据库中;
- 开始将数据从
-
前端查询
- 从 Redis 查询设备信息:首先从
sn:detail:${sn}
中获取设备信息,如果拿不到则从数据库中获取。然后保存到redis(sn:detail:${sn}
) - 数据一致性检查:与
sn:incr:${sn}
中的时间戳进行比较,- 时间戳一致直接返回
- 时间戳不一致,触发同步操作,更新
sn:detail:${sn}
和数据库,确保拿到的是最新数据。
- 从 Redis 查询设备信息:首先从
架构设计
系统设计图
时序图
注意事项
- 同一时间最多能并发处理mqtt请求数量:待压测
- Redis缓存数据设置TTL:
- 设备增量数据建议设置TTL为一天,然后当被消费后清理掉;
- 单体架构:限制待消费队列长度:
sn:incr:set
; - 可以将设备全量信息拆分成不同的topic保存到不同的redis-key中,例如:
deviceInfo/complete
,deviceInfo/installedAppInfo
等; - 其他注意事项待定