4. CDE平台架构设计

CDE(Common Data Environment,公共数据环境)不是一套“网盘+权限”的简单组合,而是承载工程项目全生命周期模型、文档、流程与协同数据的生产级平台。当项目规模从单体建筑扩展到园区、线性工程乃至多标段集群时,平台需要同时面对成千上万个模型文件、数十种专业格式、跨组织权限隔离以及7×24小时的协同访问。因此,CDE的架构设计必须从“能跑起来”走向“跑得稳、扩得动、坏不了”。本节围绕分层架构、微服务与模块化、云原生部署、高可用设计与可扩展性五个方面展开,重点说明每一层解决什么问题、关键实现如何落地,以及如何判断设计是否达标。

一、分层架构:把“数据、服务、交互”拆开

CDE平台最忌讳把所有逻辑塞进一个应用。推荐采用五层结构:接入层、应用服务层、领域服务层、数据层、基础设施层。接入层负责统一入口、身份认证、限流与路由,通常由API网关承担;应用服务层面向具体业务场景,如模型轻量化、文档审批、问题追踪;领域服务层沉淀可复用的核心能力,如文件解析、版本管理、权限校验、工作流引擎;数据层区分结构化数据(项目、用户、权限、流程实例)与非结构化数据(模型、图纸、PDF、点云);基础设施层提供计算、存储、网络与可观测能力。

分层的价值在于依赖方向单一:上层依赖下层,下层不感知上层。例如“模型轻量化”应用服务调用“文件解析”领域服务,领域服务只依赖对象存储与转换引擎,不关心前端是Web还是移动端。这样当轻量化算法升级时,只需替换领域服务实现,应用层接口保持不变。判断分层是否合理,可以看一个指标:跨层调用是否被禁止。如果应用服务直接写SQL访问数据库,或接入层直接调用对象存储,说明分层已经名存实亡。

二、微服务与模块化:按业务能力切分,而非按技术切分

微服务的切分原则是围绕业务能力,而不是“一个表一个服务”。CDE中相对稳定的服务边界包括:身份与权限服务、项目空间服务、文档与版本服务、模型转换服务、工作流服务、通知服务、检索服务、审计服务。每个服务拥有独立的数据存储与生命周期,通过API或事件通信。例如文档上传成功后,文档服务发布“DocumentUploaded”事件,模型转换服务订阅后触发轻量化,通知服务订阅后推送消息。这种事件驱动方式避免了服务间的同步强耦合。

模块化则体现在服务内部:即使是一个转换服务,也应划分为“格式识别、几何解析、轻量化、缩略图生成、结果回写”等模块,模块之间通过明确接口交互。微服务不是越小越好,过度拆分会导致分布式事务、链路追踪和运维成本急剧上升。对于中小型CDE,可以采用“模块化单体+关键服务独立”的过渡策略:先将权限、转换、检索拆出,其余保持单体,待团队与流量成熟后再逐步拆分。

三、云原生部署:容器、编排与声明式交付

云原生部署的核心是容器化、编排化、声明式。每个微服务打包为容器镜像,镜像中包含运行时与依赖,保证开发、测试、生产环境一致。使用Kubernetes进行编排时,关键对象包括Deployment(无状态服务)、StatefulSet(有状态服务,如检索集群)、Service(服务发现)、Ingress(入口路由)、ConfigMap/Secret(配置与密钥)、HPA(水平自动扩缩)。

一个典型的部署单元可以这样描述:模型转换服务以Deployment运行3个副本,每个副本限制CPU 2核、内存4GB,通过HPA在CPU利用率超过70%时扩容到6个副本;对象存储使用兼容S3的分布式存储,模型文件按“项目ID/专业/版本”路径组织;数据库采用主从架构,读写分离。配置通过ConfigMap注入,密钥通过Secret管理,避免硬编码。判断云原生是否落地,可以看两个问题:能否在5分钟内从零拉起一套完整环境?能否在不改代码的前提下调整副本数与资源限额?如果答案是否定的,说明还停留在“虚拟机+手工部署”阶段。

四、高可用设计:消除单点,明确恢复目标

高可用的第一步是识别单点。CDE中常见的单点包括:单台API网关、单节点数据库、单实例转换服务、单可用区对象存储。消除单点的手段包括多副本、多可用区部署、负载均衡、故障转移与健康检查。例如API网关至少2个副本跨可用区部署;数据库采用一主两从,主库故障时由哨兵或编排器自动提升从库;对象存储使用多副本或纠删码策略。

高可用必须用RTO与RPO来量化。RTO(恢复时间目标)指故障后多久恢复服务,RPO(恢复点目标)指允许丢失多少数据。对于CDE,建议核心协同服务RTO≤30分钟、RPO≤5分钟;模型转换等异步服务RTO≤2小时、RPO≤30分钟。实现RPO的关键是备份与复制策略:结构化数据每小时增量备份、每日全量备份,并异地保存;非结构化模型文件开启跨区域复制。此外,必须定期做故障演练,例如主动下线一个数据库从库、模拟可用区断网,观察服务是否自动切换、告警是否触发、数据是否一致。没有演练的高可用方案只是纸面承诺。

五、可扩展性考量:从“能扩”到“扩得划算”

可扩展性分为垂直扩展与水平扩展。垂直扩展提升单机配置,简单但有上限;水平扩展增加实例数量,是云原生的主要方向。CDE中,无状态服务(网关、应用服务、转换服务)天然适合水平扩展;有状态服务(数据库、检索集群)需要分片、读写分离或分布式架构。扩展性设计要提前考虑数据分区:按项目ID分库分表,避免单表过亿;模型文件按项目与时间分目录,避免单目录文件过多导致列举缓慢。

另一个关键是异步化与削峰。模型转换、批量导出、全文索引更新等耗时操作应放入消息队列,由消费者按能力拉取,避免请求堆积拖垮平台。例如使用Kafka或RabbitMQ,设置重试与死信队列,保证失败任务可追踪、可重放。判断可扩展性是否达标,可以观察:当并发上传量增加3倍时,系统是线性扩容还是出现瓶颈?瓶颈出现在哪一层?如果瓶颈在数据库连接数或单点转换服务,说明扩展设计尚未闭环。

CDE平台分层架构与云原生部署示意 依赖方向自上而下 · 无状态服务水平扩展 · 有状态服务主从/分片 接入层 API网关 身份认证 限流/路由 负载均衡 多副本 应用服务层 模型轻量化 转换/缩略图 文档审批 版本/签章 问题追踪 BIM协同 检索服务 全文/属性 领域服务层 文件解析 IFC/RVT/DWG 版本管理 基线/分支 权限校验 组织/角色 工作流引擎 审批/会签 审计 日志/追溯 数据层 结构化数据 项目/用户/权限/流程 非结构化数据 模型/图纸/PDF/点云 检索索引 全文/属性 缓存 Redis 基础设施层 Kubernetes 容器镜像 对象存储 消息队列 监控/日志 无状态·水平扩展 有状态·主从/分片 高可用:多副本 · 多可用区 · RTO≤30min · RPO≤5min 可扩展:HPA自动扩缩 · 消息队列削峰 · 按项目分片

六、把架构落到可检查的配置上

架构设计最终要落到可执行的配置与检查项。以下是一份面向CDE核心服务的部署检查表示例,参数为教学假设值,实际项目应按压测与业务SLA调整。

检查项 示例配置/目标 判断依据
API网关副本数 ≥2,跨可用区 单副本故障时入口不中断
模型转换服务 3副本,CPU 2核/内存4GB,HPA阈值70% 并发上传增加时自动扩容
数据库 一主两从,读写分离,每日全量+每小时增量 主库故障可自动提升从库
对象存储 多副本或纠删码,跨区域复制 单节点/单区域故障数据不丢
消息队列 重试3次,死信队列保留7天 失败任务可追踪、可重放
监控告警 CPU、内存、队列积压、转换失败率 异常5分钟内触发告警
实践提示:架构评审时不要只问“用了什么技术”,而要问三个问题:单点在哪里?扩容时哪一层先到瓶颈?故障后多久能恢复、丢多少数据?能清晰回答这三个问题,架构设计才算真正闭环。

综上,CDE平台架构设计的关键在于:用分层隔离变化,用微服务与模块化控制复杂度,用云原生实现弹性与一致性交付,用高可用消除单点并量化恢复目标,用可扩展性设计应对项目规模增长。五者不是并列选项,而是相互支撑的整体——分层是骨架,微服务是器官,云原生是运行方式,高可用是底线,可扩展性是未来空间。