做工业软件之前。我一直觉得程序这东西不就是输入处理输出有问题就查日志。有异常就看报错。直到后来开始做涂装车间中控、设备联网、PLC 通讯、MQTT 这些东西之后。我才发现工业项目里最可怕的。不是报错。而是“它看起来一切正常。”一、工业现场很多问题根本没有异常我印象特别深的一次现场反馈“有台车丢了。”当时我第一反应是不是数据库没写进去。结果查了一圈数据正常MQTT 正常PLC 正常Redis 正常服务也没挂但车的状态就是不对。后来查了很久。发现是 MQTT 消息顺序乱了先收到出站后收到进站。于是系统状态直接错乱。最离谱的是整个过程没有任何异常。日志也全是正常的。二、后来我越来越怕“时间”互联网项目里。时间通常只是个字段。工业项目里。时间有时候是命。尤其做统计之后。每天都在处理停台时长生产节拍实际运行时间线体开动率综合可动率后来我发现工业现场最恐怖的事情之一。就是“时间没统一。”比如一个地方按秒算一个地方按分钟算最后报表直接歪掉。还有一次更离谱日报统计一直不对。查到最后发现车间统计周期不是自然日。而是当天08:00:00 ~ 次日08:00:00后来整整改了两天。三、工业系统特别容易出现“偶现问题”这种问题真的能把人逼疯。比如MQTT 偶尔重复消费程序没报错。但业务执行了两次。Redis 锁偶尔不释放后面的车辆全部卡死。PLC 某个点位偶尔延迟状态全乱。网络偶尔抖一下设备离线了。结果其实设备根本没问题。这种问题最折磨人的地方在于它不稳定复现。你现场一去它好了你远程一看它正常等你下班它又出问题。四、我第一次见识 retained 的威力之前有个 MQTT Topic负责车辆进站后来服务重启了一次结果半小时前已经过点的车又重新过了一遍当时现场直接懵了后来查了半天发现Broker 保存了 retained 消息程序重新订阅后Broker 又把最后一条消息推了一次于是业务重新执行。那一刻我突然理解为什么工业系统这么怕“重复执行”。因为很多事情真的只能执行一次。五、工业项目里最怕的不是挂而是“半死不活。”有时候服务明明在线。但MQTT 不消费了Redis 卡住了数据延迟了PLC 状态不更新了更离谱的是。Kubernetes 还觉得Pod RunningNacos 也觉得服务健康但现场已经炸了。所以后来我越来越觉得工业系统不能只看服务在线端口正常CPU 正常因为业务正常才是真的正常。六、工业现场真的没有“重启试试”互联网项目里。重启一下可能就恢复了。工业现场不一样。因为你根本不知道重启之后MQTT 会不会重新推 retainedRedis 锁会不会丢PLC 会不会重连失败状态会不会错乱车辆会不会重复过点有一次只是重启了一个服务。结果所有缓存状态全错了。后来查出来程序启动时重新加载了 Redis 数据但现场 PLC 状态已经变了。于是系统认为设备在线实际上设备已经停了。七、工业项目特别依赖“现场经验”后来我发现。工业项目很多问题。根本不是代码逻辑问题。而是现场逻辑问题。比如同样叫“停台”不同产线含义都不一样有的机器人停了算停台有的链条停了才算还有的停超过30秒才统计这种东西没人告诉你文档也不一定写只能靠现场慢慢磨。八、工业项目做久了真的会开始迷信后来现场甚至出现过一种情况某个服务只要晚上重启第二天一定出问题。一开始大家都觉得扯后来真查出来凌晨有个 XXL-Job 在跑统计同时 Redis 正在主从切换MQTT 又在重连三个东西碰一起概率特别低但它真发生了于是现场的人开始说“别动它动了准出事。”九、工业软件最后拼的其实是“稳定”现在我越来越觉得工业项目做到最后拼的不是架构多高级微服务多漂亮Kubernetes 多先进而是稳不稳定。因为工业现场一次重复执行一次误动作一次状态错乱代价都特别大。十、最后一句现在再有人问我工业项目为什么像“玄学”我可能不会说分布式高并发微服务我会说“因为你永远不知道凌晨三点到底是哪一环出了问题。”有时候是 MQTT有时候是 Redis有时候是 PLC还有时候只是现场老师傅手动按了一下按钮。