MDM五十万台设备高并发场景解决方案【后台管理】

单体架构

方案设计

  1. 终端设备
  • 终端将消息发送到 MQTT
  1. 后台管理
  • 消息存储到 Redis
    • sn:incr:${sn}:终端同步到后台管理的增量数据
    • sn:incr:set:待消费的sn队列
    • sn:detail:${sn}: 返回给前端的完整数据
  • 执行流程
    1. 终端将设备增量信息发送到后台
    2. 后台将数据保存到redis(sn:incr:${sn}),同时添加到待消费队列(sn:incr:set
      • 通过 SADD 将设备ID推入队列,通过 `SPOP 消费队列。
    3. 多消费者(线程池):
      • 不断循环尝试拉取消费队列(sn:incr:set),拉取成功则尝试进行
      • 消费失败记录失败日志
  1. 前端查询

    1. 从 Redis 查询设备信息:首先从 sn:detail:${sn} 中获取设备信息,如果拿不到则从数据库中获取。然后保存到redis(sn:detail:${sn}
    2. 数据一致性检查:与 sn:incr:${sn} 中的时间戳进行比较,
      • 时间戳一致直接返回
      • 时间戳不一致,触发同步操作,更新 sn:detail:${sn} 和数据库,确保拿到的是最新数据。

架构设计

系统架构图

应用层
持久层
缓存区
服务层
通信层
终端层
接入服务
数据处理
1.发布MQTT消息
2.推送消息
3.写增量缓存HSET sn:incr:snxxx
4.加入待处理集合SADD sn:incr:set
5.消费处理SPOP sn:incr:set
6.读增量数据HGET sn:incr:snxxx
7.持久化存储
8.查询缓存GET sn:detail:snxxx
9.缓存未命中
10.回填缓存
11.触发强制同步
12.读持久层
13.更新缓存
Web管理后台
MySQL数据库
Redis缓存
消费服务 线程池
数据同步服务
消息接收服务
MQTT Broker
设备终端SN001/SN002

时序图

设备终端MQTT Broker消息接收服务Redis消费服务MySQL同步服务WEB管理后台WEB前端发布消息(QoS1, payload)推送消息(按QoS速率控制)HSET sn:incr:snxxx (增量数据)SADD sn:incr:set (加入集合)SPOP sn:incr:set (非阻塞获取)返回SNHGET sn:incr:snxxxx返回增量数据UPSERT设备数据(事务)操作结果loop[多线程消费]获取设备详细信息GET sn:detail:snxxx(nil)查询设备数据返回数据SETEX sn:detail:snxxx (带TTL)alt[缓存未命中]返回缓存数据HGET sn:incr:snxx (取时间戳)返回时间戳触发强制同步SELECT最新数据返回数据原子更新HSET+SET通知更新完成alt[incrTimeStamp与detailTimeStamp数据不一致]设备终端MQTT Broker消息接收服务Redis消费服务MySQL同步服务WEB管理后台WEB前端

微服务架构

方案设计

  1. 终端设备
  • 终端将消息发送到 MQTT
  1. 后台管理
  • 消息存储到 Redis
    • sn:incr:${sn}:终端同步到后台管理的增量数据
    • sn:incr:set:待消费的sn队列
    • sn:detail:${sn}: 返回给前端的完整数据
  • RabbitMQ 处理同步请求:
    • ` sn:sync:${sn}:设备同步消息(使用发布订阅模式)
  • 执行流程
    1. 终端将设备增量信息发送到后台
    2. 后台将数据保存到redis(sn:incr:${sn}),然后将同步消息放到 RabbitMQ
    3. RabbitMQ
      • 配置 QOS 控制并发处理请求的数量;
    4. RabbitMQ消费者
      • 开始将数据从 redis 同步到数据库中;
  1. 前端查询

    1. 从 Redis 查询设备信息:首先从 sn:detail:${sn} 中获取设备信息,如果拿不到则从数据库中获取。然后保存到redis(sn:detail:${sn}
    2. 数据一致性检查:与 sn:incr:${sn} 中的时间戳进行比较,
      • 时间戳一致直接返回
      • 时间戳不一致,触发同步操作,更新 sn:detail:${sn} 和数据库,确保拿到的是最新数据。

架构设计

系统设计图

应用层
持久层
中间件层
微服务层
通信层
终端层
接入服务
数据服务
1.发布MQTT
2.推送消息
3.HSET增量数据
4.发布同步消息
5.消费消息
6.读取增量数据
7.持久化存储
8.查询缓存
9.缓存未命中
10.回填数据
11.触发强制同步
Web管理后台
MySQL
RabbitMQ 消息: sn:sync:snxxx
Redis缓存 sn:incr:snxxx sn:detail:snxxx
数据同步服务
消息接收服务
MQTT Broker
设备终端

时序图

设备终端MQTT_Broker消息接收服务RedisRabbitMQ数据同步服务MySQLWeb前端1. 发布设备数据(QoS1)2. 推送消息3. HSET sn:incr:${sn}4. 发布同步消息 RoutingKey: sync.${sn}5. 推送消息(prefetch=10)6. HGET sn:incr:${sn}返回增量数据7. 执行UPSERT8. ACK确认9. 更新sn:detail:${sn}8. NACK+重试alt[成功][失败]loop[消费者线程池(QoS控制)]10. GET sn:detail:${sn}返回数据11. 查询数据返回结果12. 回填缓存alt[缓存命中][未命中]设备终端MQTT_Broker消息接收服务RedisRabbitMQ数据同步服务MySQLWeb前端

注意事项

  • 同一时间最多能并发处理mqtt请求数量:待压测
  • Redis缓存数据设置TTL:
    1. 设备增量数据建议设置TTL为一天,然后当被消费后清理掉;
  • 单体架构:限制待消费队列长度:sn:incr:set
  • 可以将设备全量信息拆分成不同的topic保存到不同的redis-key中,例如:deviceInfo/completedeviceInfo/installedAppInfo 等;
  • 其他注意事项待定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值