当前位置: 首页 > news >正文

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 等;
  • 其他注意事项待定
http://www.lryc.cn/news/602409.html

相关文章:

  • Django + Celery 详细解析:构建高效的异步任务队列
  • 负载均衡算法中的加权随机算法
  • 【pytest高阶】源码的走读方法及插件hook
  • 端到端的核心区别点
  • 标准SQL语句示例
  • 【力扣热题100】哈希——两数之和
  • 数据库概述(学习笔记)
  • 能源智跃:大模型破壁数据孤岛,铸就智能转型新范式
  • 腾讯云centos7使用docker部署生产环境中间件
  • 力扣 hot100 Day58
  • eclipse更改jdk环境和生成webservice客户端代码
  • STM32入门之DMA直接存储器存取
  • 雷达系统设计学习:自制6GHz FMCW Radar
  • 从单枪匹马到联盟共生:白钰玮的 IP 破局之路|创客匠人
  • 【智慧物联网平台】编译jar环境 Linux 系统Maven 安装——仙盟创梦IDE
  • 2025创始人IP如何破局?
  • 【智慧物联网平台】编译jar环境 Linux 系统编译IOT物联网——仙盟创梦IDE
  • 解构远程智能系统的视频能力链:从RTSP|RTMP协议接入到Unity3D头显呈现全流程指南
  • Ansible安装与入门
  • WPF,按钮透明背景实现MouseEnter
  • 【Linux】Ubuntu上安装.NET 9运行时与ASP.NET Core项目部署入门
  • C#/.NET/.NET Core技术前沿周刊 | 第 48 期(2025年7.21-7.27)
  • 1.gradle安装(mac)
  • 基于AFLFast的fuzz自动化漏洞挖掘(1)
  • 全新AI工具小程序源码 全开源
  • 时序数据库选型指南:工业大数据场景下基于Apache IoTDB技术价值与实践路径
  • Verilog简易的按键消抖模块
  • css 实现虚线效果的多种方式
  • Kubernetes 存储入门
  • 【自动化运维神器Ansible】Ansible常用模块之unarchive模块详解