技术白皮书
把交付链路做成领域工程
本文面向架构师与技术决策者,系统阐述脉冲(Pulse)的总体架构、发布引擎、安全网设计与可靠性工程, 回答三个问题:交付为什么可审计、为什么可复用、凭什么不同。
01 · 摘要
一句话读懂脉冲
脉冲(Pulse)是面向研发团队的全链路研发交付平台:需求协作、版本发布工作台、流水线引擎、中间件管理与 DORA 度量一体化。它的三个差异化锚点是:
可审计
版本状态机 + 部署计划 DAG + 快照留存,每一跳都有据可查,回退有锚点。
可复用
同一套部署计划语义适配六种执行器形态,基础设施差异被编排层吸收。
可演进
DDD + CQS 的领域模型让能力按聚合生长,新执行器、新度量即插即用。
02 · 交付之痛
为什么发布总是靠运气
大多数团队的发布能力是「脚本堆」出来的:构建一个脚本、部署一个脚本、回退再一个脚本。脚本之间没有共享语义, 于是四个问题反复出现:
- 发布靠脚本堆——换个人接手就重写一遍,无人说得清全链路现状;
- 回退靠运气——整体重放旧版本,错误回退比不回退更危险;
- 环境漂移——预发与生产配置不一致,问题总在上线后才暴露;
- 度量缺失——发布数据散落在日志与群里,管理层看不到交付效能。
脉冲的问题定义因此而来:把需求 → 版本 → 发布 → 验证 → 回退连成一条可审计的链, 让每个环节的状态、制品与操作都有唯一的系统记录。
03 · 总体架构
DDD + CQS + EDA:三件事各司其职
DDD 管模型边界,CQS 管读写路径,EDA 管跨域协作。
CQS:命令与查询分离
命令进入领域服务(DomainService)完成业务校验与状态变更,并发领域事件;查询走应用服务(AppService)直接读取, 不绕经领域层。GraphQL 的 mutation / query 与这两条路径一一对应。
EDA:领域事件驱动协作
BFF 在命令完成后发布领域事件,经消息总线由后台消费者异步处理编排、部署与审计。版本、流水线、制品、实例等核心事件 把十一个限界上下文连成整体,而彼此不直接依赖。
统一入口与开源底座
GraphQL 作为唯一 API 入口由 BFF 层编排聚合;状态机、流程编排、事件总线等企业级组件沉淀为开源框架 矩阵(Matrix), 平台与框架共享同一套工程约定。
五级环境建模(DEV / TEST / FAT 预发 / PROD / DR),预发与生产配置一致,问题拦在上线之前。
04 · 发布引擎
版本状态机 × 部署计划 DAG
版本交付状态机管「业务推进到哪了」,部署计划 DAG 管「技术上怎么落地」,两层各自独立又互相触发回写。
| 甬道 | 包含状态 | 职责 |
|---|---|---|
| 功能开发 | SCHEDULING / DEVELOPING / WAIT_AUDIT | 需求排期与开发推进,状态机管住每一跳 |
| 功能测试 | SMOKING / WAIT_REGRESS / REGRESSING / REGRESSED | 冒烟与回归测试全程状态化,结果可审计 |
| 回归发布 | WAIT_RELEASE / RELEASING / WAIT_ACCEPT / RELEASE_FAILED / REPAIRING | 发布执行与失败修复,含审批门禁 |
| 已验收 | ACCEPTED / CLOSED | 业务验收闭环,版本生命周期终点 |
版本在四个甬道间单向推进,每一步都受状态机约束——跳步、逆行在模型层就不可能发生。
生产发布两步走
先创建部署计划(不启动),确认后再执行。计划是 DAG:构建 → 部署 → 监控 → 冒烟 → 通知, 节点可审批、可重试、可单独回退——发布从来不是一锤子买卖。
灰度分批推进
按比例分批:[10, 30, 100], 批次间进入 WAIT 审批门禁;金丝雀模式单批 30% 流量先行验证。批次拆为独立计划节点,可单独审批、单独回退。
05 · 安全网
快照差异回退:以状态为锚
传统回退是整体重放——目标版本有什么就部署什么,与现状无关。脉冲每次发布留存环境快照,回退时先计算差异:
Δ = 目标快照 − 当前快照
只对 changed / added / removed 节点生成差异部署计划,unchanged 直接跳过——业务态精准还原,而不是盲目重放。 系统级回滚同样是「重部署旧版本制品的新 Plan」,复用校验、监控与审批门禁,安全语义不打折。
快照五要素:制品版本 + 配置版本 + 流量拓扑 + Git 状态 + 版本状态。
06 · 多形态部署
一套编排语义,六种执行器
部署执行器是可插拔的 SPI:上层的计划、审批、快照、回退语义完全一致,下层适配不同基础设施。
K8S 原生
已联调fabric8 KubeClient + FTL 模板渲染,集群内 Callback Job 自管生命周期。
Argo CD GitOps
已联调Helm Chart + ApplicationSet 三层分离,模板 / 参数 / 编排解耦。
Ansible VM
已联调Semaphore + 7 Phase playbook,备份保留、健康检查、主动回调。
Salt
代码就绪salt-api state.sls 驱动,同步等待 + 内部自回调。
OpenTofu
代码就绪Go Runner 执行 tofu init/plan/apply,面向云资源编排。
Hybrid 混合
代码就绪按实例形态自动路由到 K8S / VM / 云资源三路分流。
制品双通道(Harbor 镜像 / Nexus 归档)与统一回调入口贯穿所有执行器链路——无论部署到哪,状态回传与审计语义不变。
07 · 可靠性工程
假设每一环都会失联
分布式部署链路里,消息会丢、回调会断。脉冲的答案是:检测兜底 + 通道鉴权,双管齐下。
超时兜底扫描器
部署节点事件丢失时,计划会永远停在 RUNNING。后台扫描器定时巡检运行中的节点:超时即复用既有领域服务收尾 (DAG 传播、告警推送一并触发);若计划运行中却无运行中节点,判定为 DAG 断链,直接标失败。
兜底结果自愈为 FAILED 并可人工重试——系统里不存在「永久 RUNNING」的黑洞;兜底机制对数据模型零迁移。
回调 HMAC 验签
所有执行器回调走统一入口:HMAC-SHA256 签名 + 5 分钟时间戳防重放。Jenkins、GitOps 回调、Ansible 三类发送端统一补签,secret 仅存放于受控配置,不落日志、不进镜像。
伪造回调无法通过验签——发布状态只能由真实执行器改变。
08 · 领域建模实践
三个聚合切分案例
平台能力如何生长,取决于聚合怎么切。以下案例来自真实演进中的取舍。
空间与集群:归属链即权限边界
空间属于环境、集群属于「空间 × 应用」、实例属于集群——三级归属链一旦确立, 权限校验、资源配额、实例巡检都有了天然的边界:在哪个空间,就受哪套规则管。
中间件管理域:定义层 × 实例层
初版模型把「申请」与「装到哪」混在一个聚合里,一次中间件申请被迫在每个环境重复审批。 拆分为定义层(审批一次,中间件聚合根)与实例层(按环境派生实例)后,审批收敛、派生自动—— 这是用聚合切分直接消灭流程冗余的典型案例。
应用类型:会演进的脚本版本管理聚合根
Jenkinsfile 与 Helm Chart 不再是散落的静态文件,而是挂在应用类型聚合根下的有状态资产: 每种类型在 GitLab 独立分支演进,main 分支即线上正式脚本,发布时按文件路径选择性复制,互不干扰。
09 · 度量与治理
DORA 四指标,从事件到改进
度量不是事后补报表,而是发布链路的自然副产品。
采集链路
- 1 领域事件统一汇入审计事件表(通用事件模型)
- 2 定时聚合产出周期快照(部署频率 / 变更前置时间 / 变更失败率 / MTTR)
- 3 GraphQL 查询供管理看板消费,按产品 / 环境维度下钻
治理闭环
指标的意义不在墙上,而在例会里:变更失败率指向哪类发布、前置时间卡在哪个甬道、恢复时长慢在审批还是执行—— 脉冲把发布数据留在系统内,让每个改进都有据可依。
权限矩阵内建职责分离:没有任何一个角色能单独走完发布全链路。
10 · 演进路线
从容器闭环到多云联邦
V1
社区版
容器部署闭环,覆盖构建、部署、回退核心链路。
已发布
V2
专业版
GitOps 深度集成 + 灰度分批审批,面向多团队协作。
已发布
V3
企业版
混合部署(VM / 云资源)+ 度量治理增强 + 私有化交付。
规划中
V4
旗舰版
多云联邦编排,引入 AI 发布风险预测。
规划中