
机器人系统中地图、任务、设备、告警都运行在一个应用里这不就是大泥球吗不一定。这里混淆了部署方式和代码结构。单体描述的是部署方式单体模式Monolith指的是系统的主要能力以一个可独立交付的部署单元为主通常整体发布和运行。它内部仍然可以划分模块机器人应用 ├── 设备接入 ├── 地图管理 ├── 任务调度 ├── 状态监控 └── 告警处理这些模块可以共同部署但各自拥有明确职责。任务模块不必知道设备协议细节地图模块也不应随意修改机器人连接状态。所以“部署在一起”和“代码混在一起”是两回事。单体为什么不等于大泥球判断一个系统时需要分开看两个维度部署单元有多少个内部边界是否清晰。先看左上它就是本文要保留的状态——部署简单但模块边界清楚。再看右下即使拆成多个进程边界不清、发布仍然互相牵制也未必得到更好的架构。左上角是模块化单体地图、任务、设备和告警各有归属但仍然一起发布。左下角才是通常所说的大泥球界面直接操作设备任务流程随意读取地图内部数据告警逻辑散落在各个角落。它恰好是单体但混乱来自边界消失而不是部署单元只有一个。右上角是边界清晰的分布式系统。各单元可以独立演进但同时也要承担通信、部署和数据一致性成本。它不天然优于左上角只是适合不同约束。右下角是分布式单体看起来已经拆开变化和发布却仍然绑在一起。一次需求要同时修改多个单元发布顺序相互依赖数据也被随意共享。图里真正的区别是拆分部署可以改变运行边界却不会自动创造职责边界。为什么单体常常适合作为起点机器人系统早期最难的通常不是部署而是确定归属。例如机器人离线后的任务恢复应该由任务模块负责还是由设备模块负责地图版本由地图模块管理还是由机器人档案管理这些问题通常需要经过真实业务才能逐渐清晰。在边界尚未稳定时保持单体有几个直接好处模块之间可以进行本地调用不必先设计远程协议调试和部署路径更短边界判断错误时调整成本相对较低。单体减少的是系统刚起步时不必要的分布式复杂度。单体也有明确代价单体的主要问题不是“不够先进”而是多个模块共享同一个发布和运行边界。修改一个模块通常要重新测试和发布整个应用某个模块出现严重故障可能影响整体运行模块难以独立扩容团队发布节奏也会相互影响。这些代价真实存在。但它们是否已经超过拆分后的通信、数据一致性、部署和故障处理成本需要结合系统现状判断。什么时候才值得拆代码量大、目录多或者团队开始讨论微服务都不是充分理由。更可靠的拆分信号是某个模块需要独立扩容某类故障必须与其他能力隔离不同模块确实需要独立发布职责和数据归属已经稳定拆分边界可以明确表达。一个“必须拆”的案例仓库机器人系统里云端负责任务编排、地图管理和车队调度车端负责避障、急停和电机控制。这两部分不能长期共用一个部署单元云端升级、网络中断甚至任务模块崩溃都不应该让车辆失去实时控制能力。此时需要把云端调度和车端控制拆成独立进程或独立设备让车端在云端失联时仍能停车、避障并进入安全状态。这不是为了让架构“看起来像微服务”而是因为安全、实时性和故障隔离要求它们不能共享同一个故障边界。这里的顺序很重要先形成模块边界再考虑部署边界。如果地图、任务和设备之间仍然互相穿透提前拆分只会把函数调用变成网络调用把共享对象变成共享数据库把一次修改变成多次协调。怎么判断单体是否健康不用先数代码行数可以直接问三个问题修改一种任务规则需要同时改设备、地图和界面吗每份核心状态是否有明确的维护者核心规则能否脱离界面、数据库和通信方式独立验证如果一次变化大多能停在所属模块内单体就在发挥它应有的价值。最后单体不是微服务之前的失败阶段也不是大泥球的另一个名字。判断单体是否健康不要看它被部署成几份要看一次变化最终会传播多远。