不用redis,消息队列,mes靠谱吗

分场景说,结合你的 MES+4000 设备采集的情况。


一、先搞清楚:Redis 和消息队列在 MES 里是干嘛的?

1. Redis 干嘛用?

表格

用途说明没有 Redis 行不行?
缓存热点数据产品字典、工艺参数、设备信息这些经常读的✅ 行,直接查数据库,量不大的话没区别
实时计数 / 统计当日产量、OEE 实时计算、设备状态✅ 行,直接查数据库聚合,或者内存里算
分布式锁多实例应用防止重复报工✅ 行,用数据库行锁、唯一索引也行
Session/Token用户登录状态✅ 行,存数据库或 JWT

2. 消息队列(Kafka/RabbitMQ)干嘛用?

表格

用途说明没有 MQ 行不行?
削峰填谷几百台设备同时上报,先存队列慢慢写⚠️ 看并发量,低峰没事,高峰可能扛不住
异步解耦采集和写库分开,采集不卡⚠️ 直接写库,数据库慢了采集就卡
数据不丢消息持久化,程序崩了数据不丢⚠️ 直接写库,程序崩了那批数据就丢了
多系统分发一份采集数据同时给 MES、OEE、追溯⚠️ 要写多次,或者用数据库做中转

二、此 MES 场景,不用 Redis/MQ 靠谱吗?

场景 1:初期、数据量不大 → ✅ 完全靠谱,甚至更稳

满足以下条件,不用完全没问题:

  • 设备数量:4000 台,但不是秒级同时上报
  • 采集频率:10 秒 / 次以上,或者设备分批上报
  • 写入峰值:每秒几百条以内
  • 业务复杂度:中等,没有超复杂的实时计算

为什么更稳?

  • 少两个组件,少两个故障点
  • 运维简单,不用管 Redis 集群、MQ 集群
  • 出问题好排查,不用猜是 Redis 挂了还是 MQ 堵了
  • 数据链路短,不容易丢数据

OceanBase + TDengine 的写入能力足够扛:

  • OceanBase 三节点,每秒几千条写入轻轻松松
  • TDengine 时序数据库,每秒几万条都没问题
  • 4000 台设备,就算每秒上报一次,也才 4000 TPS,数据库完全扛得住

场景 2:高并发、高可靠要求 → ⚠️ 有点悬,建议加

这些情况建议加消息队列:

  1. 采集频率高:设备秒级甚至毫秒级上报,每秒上万条
  2. 峰值很高:比如换班、开机时,几百台设备同时连上来
  3. 数据不能丢:采集数据丢了影响追溯、影响 OEE 计算
  4. 下游系统多:一份数据要同时给 MES、看板、报警、大数据分析
  5. 数据库压力大:除了采集还有大量报表查询,读写互相影响

这些情况建议加 Redis:

  1. 热点数据读很多:比如产品、工艺参数被反复查
  2. 实时统计要求高:看板每秒刷新,实时产量、OEE
  3. 多实例部署:分布式锁、共享状态
  4. 数据库读压力大:查询多,加缓存减轻数据库压力

三、不用 Redis/MQ,怎么保证系统靠谱?

1. 应用层优化(不用中间件,也能扛)

写入优化

  • 批量写入:攒个几百条再一次写库,比一条一条写快 10 倍
  • 异步写入:应用里开个线程池写库,采集线程不阻塞
  • 本地队列:内存里搞个队列,数据库慢了先攒着,不丢采集数据

读优化

  • 本地内存缓存:字典数据、配置数据,应用启动时加载到内存,不用查 Redis
  • 定时刷新:每分钟刷新一次缓存,够用
  • 数据库读写分离:OB 三节点,查询走副本,不影响写入

可靠性优化

  • 本地落盘:采集到的数据先写本地文件,写库成功再删,程序崩了重启还能继续写
  • 重试机制:写库失败自动重试,重试失败存本地文件
  • 幂等性:用唯一键防止重复写入

四、给你的具体建议(MES+4000 设备)

阶段 1:项目初期(0~1 年)→ 不用 Redis,不用 MQ,直接干

理由:

  • 4000 台设备,分批采集,每秒也就几百条,数据库轻松扛
  • 初期业务不稳定,加中间件增加复杂度,出问题不好排查
  • 你运维能力一般,少一个组件少一份心
  • 先跑起来,验证业务,比什么都重要

怎么保证靠谱:

  • 应用层做批量写入 + 本地文件兜底
  • 字典数据用内存缓存,不用 Redis
  • 分布式锁用数据库唯一索引或行锁
  • 数据库做好监控,慢 SQL 及时优化

阶段 2:数据量上来了(1~2 年)→ 先加消息队列,再加 Redis

什么时候该加 MQ?

  • 数据库写入压力大,CPU 经常 80% 以上
  • 采集高峰期有数据丢失或延迟
  • 下游系统越来越多,一份数据要给好几个地方用

什么时候该加 Redis?

  • 查询压力大,数据库读 CPU 高
  • 实时看板刷新慢,统计不及时
  • 热点数据被反复查询

阶段 3:大规模(3 年以上)→ 全套都上

  • 数据量、并发量都很大了
  • 系统复杂度高了
  • 该加的都加上,该拆的都拆开

五、一句话总结

初期不用 Redis 和消息队列,完全靠谱,甚至更稳、更好运维。

先把系统跑起来,数据库扛不住了再加,不要一开始就搞最复杂的架构。

简单的系统,才是最可靠的系统。

阅读剩余
THE END