MES系统架构解析:主流架构模式与设计原则

大家好,我是老张。做MES系统架构这些年,我见过太多项目因为架构选型失误而返工。今天咱们就聊聊MES系统的架构设计,把我踩过的坑和积累的经验都抖出来。

一、单体架构 vs 微服务架构

先说说最基础的问题——选单体还是微服务?

单体架构,说白了就是把所有功能打包成一个应用。我2015年做的第一个MES项目就是单体架构,当时觉得挺爽,开发部署都简单。但随着工厂产线扩张,问题就来了——改一个排产模块,整个系统都得重新部署,风险太大。

单体架构的适用场景:

  • 工厂规模小(< 50个设备终端)
  • 业务流程相对固定
  • 团队人数少于10人
  • 预算有限,快速上线是首要目标

微服务架构呢?我2018年接手一个汽车零部件MES项目,客户要求支持多工厂、多租户,单体架构根本扛不住。我们拆成了十几个微服务:订单服务、排产服务、质量服务、设备服务……每个服务独立部署、独立扩展。

我的建议:别一上来就搞微服务。我见过太多团队,3个人就敢拆10个微服务,结果运维成本比开发成本还高。先单体,等业务复杂度上来了再逐步拆分,这才是正道。

二、前后端分离设计

嗯,这里要注意——MES系统的前后端分离和普通互联网应用不太一样。

传统MES是JSP+Servlet那套,前端后端揉在一起。我早期做的项目,前端工程师改个按钮样式都得找后端部署,效率极低。

现在的主流做法是:

  • 前端:Vue.js或React,负责UI展示和交互
  • 后端:Spring Boot或.NET Core,提供RESTful API
  • 通信:JSON格式,通过HTTP/HTTPS交互

为什么会这样?你想想看,MES系统的界面通常很复杂——实时看板、工单列表、设备监控、质量图表……每个模块的刷新频率、数据量都不一样。前后端分离后,前端可以独立优化渲染性能,后端可以专注业务逻辑。

我曾经踩过的坑:有个项目前后端分离做得太彻底,连基础数据字典都通过API实时查询。结果产线高峰期,一个页面要发30多个请求,卡得操作工直骂娘。后来加了本地缓存和WebSocket推送,才解决问题。

三、数据库选型与设计原则

数据库选型这块,我个人的经验是:别迷信新技术,适合的才是最好的

数据类型 推荐方案 原因
业务数据(工单、BOM、工艺) MySQL / PostgreSQL 事务性强,ACID要求高
实时数据(设备状态、产量) Redis / InfluxDB 高并发写入,时序数据
日志数据(操作日志、报警) Elasticsearch 全文检索,海量存储
文件数据(图纸、质检图片) MinIO / 对象存储 非结构化数据,大文件

设计原则,我总结了三条:

  1. 业务主键优先:工单号、批次号这些业务主键,比自增ID好用得多。我在项目中遇到过,自增ID在分库分表时简直噩梦。
  2. 适度冗余:MES系统查询多、写少。比如工单表里冗余产品名称,虽然违反第三范式,但能减少一次JOIN,查询快很多。
  3. 历史数据归档:MES数据增长极快,一个中型工厂一年能产生几亿条记录。我建议按时间分区,超过一年的数据自动归档到历史库。

小技巧:设计表结构时,预留几个扩展字段(比如ext1, ext2, ext3),用JSON格式存储。这样客户临时加字段时,不用改表结构。我靠这招少加了多少班啊。

四、核心架构图

下面这张图是我自己总结的MES系统分层架构,你们可以看看:

MES系统分层架构图 展示层(Presentation Layer) Web端(Vue.js) | 移动端(Flutter) | 看板(大屏) API网关层(Gateway Layer) 路由转发 | 认证鉴权 | 限流熔断 | 日志记录 业务服务层(Service Layer) 订单服务 | 排产服务 | 质量服务 | 设备服务 | 物料服务 工艺服务 | 人员服务 | 报表服务 | 追溯服务 数据层(Data Layer) MySQL(业务库) | Redis(缓存) | InfluxDB(时序) | ES(日志) 基础设施层(Infrastructure) Docker/K8s | Nginx | 消息队列(RabbitMQ/Kafka)

这张图我用了好多年,每次给客户讲架构都拿它。你看,从上到下五层,每层各司其职。展示层只管界面,业务层只管逻辑,数据层只管存储。这样设计的好处是——哪层出问题就改哪层,不影响其他部分。

五、架构选型的避坑指南

最后,分享几个我亲身经历的教训:

  • 别过度设计:有个项目,客户就3条产线,非要上微服务+容器化。结果运维团队招了5个人,比开发团队还大。后来我帮他们改回单体,成本降了60%。
  • 数据库别选太冷门:我见过用MongoDB做主库的MES,查询工单时各种别扭。MES是强事务场景,关系型数据库才是正道。
  • 前后端分离别忘SEO:虽然MES系统不需要搜索引擎优化,但服务端渲染对首屏加载速度影响很大。产线看板如果加载慢,操作工会疯的。

总结一下:架构没有银弹。小厂用单体,大厂用微服务,中型厂可以折中——核心模块单体,边缘模块微服务。数据库选型以MySQL为主,辅以Redis和时序库。记住,架构是为业务服务的,别为了技术而技术。


公众号:蓝海资料掘金营,微信deep3321