4. 参考架构与分层设计

计算生物学数据平台面对的是多组学、多模态、长周期、强合规的数据资产。若把平台简单理解为“上传文件—跑分析—出报告”,很快就会在数据量增长、分析工具更替、审计要求提高时失控。参考架构的价值在于:用稳定的分层边界把变化隔离在局部,让每一层只解决一类问题,并通过明确的交互协议协作。本节采用六层参考架构:数据接入层、存储层、计算层、服务层、治理层与安全层。前四层构成主数据通路,治理层与安全层是横切能力,贯穿所有层。

各层职责与关键对象

数据接入层负责把外部数据可靠地引入平台。它的核心对象是“接入任务”,而不是文件本身。一个接入任务需要描述:数据源类型(对象存储、SFTP、HTTP API、测序仪落地目录、数据库)、传输方式(批量拉取、增量同步、事件触发)、格式(FASTQ、BAM、VCF、CSV、Parquet)、校验规则(MD5、行数、样本清单比对)以及元数据抽取方式。接入层不负责解释生物学含义,只保证“完整、可追溯、可重放”。典型实现是调度器加连接器:调度器管理任务生命周期,连接器负责具体协议。接入完成后,接入层向治理层登记数据集标识,向存储层写入原始区,并发出“数据已就绪”事件。

存储层按数据成熟度分区,而不是按项目随意建目录。推荐四区模型:原始区(Raw)保存不可变原始文件;清洗区(Clean)保存标准化后的中间结果;分析区(Curated)保存可供复用的分析数据集;发布区(Published)保存对外服务的数据产品。存储层的关键协议是“路径即契约”:对象键必须包含数据集标识、版本、分区信息,例如 curated/rnaseq/ds-20240512/v3/chrom=1/part-000.parquet。这样计算层和服务层无需询问“文件在哪”,只需按约定拼接路径。存储层还需提供生命周期策略,例如原始区保留 10 年、清洗区保留 180 天、分析区按版本保留。

计算层把存储层的数据转化为结果。它不直接面向用户,而是面向“计算任务”。计算层的核心协议是任务描述:输入数据集版本、镜像或环境标识、资源规格(CPU、内存、GPU)、参数、输出路径。计算层应支持批处理、交互式分析和流程编排三类负载。以变异检测为例,任务描述可写为:输入 curated/wgs/ds-20240512/v3,工具 gatk:4.5.0,参考基因组 GRCh38.p14,输出 curated/vcf/ds-20240512/v1。计算层执行时从存储层拉取输入,运行完成后把输出写回存储层,并向治理层登记血缘关系。计算层不保存长期状态,所有状态都应落在存储层或治理层。

服务层把数据和分析能力包装成稳定接口。它面向三类消费者:分析人员、临床或科研应用、外部系统。服务层的关键协议是 API 契约:查询接口按数据集标识和版本返回元数据或数据切片;分析接口接收任务请求并返回任务标识;结果接口按任务标识返回状态和产物地址。服务层不直接访问原始文件,而是通过存储层提供的访问代理或数据虚拟化层读取,以便统一鉴权和审计。服务层还应提供限流、缓存和版本兼容策略,避免上游计算层升级导致下游应用中断。

治理层是横切层,负责元数据、血缘、质量、标准和生命周期。治理层不搬运数据,而是记录“数据是什么、从哪来、到哪去、是否可信”。核心对象是元数据实体:数据集、字段、版本、任务、样本、实验。治理层通过事件总线接收各层上报的事件,例如接入完成、计算开始、计算完成、服务发布。血缘关系应记录到字段级或至少文件级,以便出现质量问题时快速定位影响范围。治理层还负责数据标准:样本命名规范、受控词表、参考基因组版本、单位约定。没有治理层,平台会退化为文件服务器。

安全层同样是横切层,负责身份、授权、加密、审计与隐私保护。安全层的关键协议是“每次访问都鉴权”:用户或服务账号在访问存储、计算、服务时,必须携带令牌,由策略引擎判断是否允许。策略应基于属性而非固定角色,例如“仅允许本项目成员读取本项目分析区数据”“仅允许具有临床资质的人员访问含 PHI 的发布区数据”。安全层还需对敏感数据做脱敏或令牌化,并记录所有访问日志。审计日志应独立存储,防止被篡改。

计算生物学数据平台六层参考架构与交互协议 数据接入层 连接器 · 调度器 · 校验 · 元数据抽取 · 事件发布 协议:接入任务描述 + 就绪事件 存储层 原始区 Raw · 清洗区 Clean · 分析区 Curated · 发布区 Published 协议:路径即契约 + 生命周期 计算层 批处理 · 交互分析 · 流程编排 · 容器化环境 · 资源规格 协议:任务描述 + 血缘上报 服务层 查询 API · 分析 API · 结果 API · 限流 · 缓存 · 版本兼容 协议:API 契约 + 任务标识 治理层(横切) 元数据 · 血缘 · 质量 · 标准 · 生命周期 事件总线接收各层上报 字段级血缘定位影响范围 样本命名 / 参考基因组 / 单位约定 安全层(横切) 身份 · 授权 · 加密 · 审计 · 隐私保护 每次访问都鉴权(令牌 + 策略引擎) 属性策略:项目成员 / 临床资质 脱敏 / 令牌化 · 独立审计日志 贯穿四层 贯穿四层

交互协议:让层与层之间“可对话”

分层不等于隔离。六层之间需要一组最小但明确的交互协议,否则会出现“接入层直接写分析区”“服务层绕过治理层查元数据”等破坏边界的做法。以下协议是参考架构的骨架。

数据集标识协议。任何跨层传递的数据都必须携带全局唯一的数据集标识,格式建议为 ds-{来源}-{日期}-{序号},并附带版本号。接入层生成标识,存储层按标识组织路径,计算层按标识读取输入并生成新版本,服务层按标识和版本对外暴露。没有标识,血缘和质量追溯都无从谈起。

事件协议。各层在关键状态变化时向治理层事件总线发布事件,事件至少包含:事件类型、数据集标识、版本、时间戳、发起者、状态。例如接入层发布 dataset.ingested,计算层发布 job.started 和 job.completed,服务层发布 api.published。治理层消费事件并更新元数据和血缘。事件应幂等,允许重放。

任务描述协议。计算层不接受“帮我跑一下”这种模糊请求,而接受结构化任务描述。一个最小任务描述包含:任务标识、输入数据集标识与版本、工具镜像与版本、参数键值对、资源规格、输出数据集标识、回调地址。服务层把用户请求翻译成任务描述,计算层执行后把结果写回存储层并发布事件。

访问控制协议。安全层不信任任何层内部的“默认允许”。存储层、计算层、服务层在访问数据或执行任务前,必须向策略引擎发起鉴权请求,携带主体身份、操作类型、资源标识和环境上下文。策略引擎返回允许或拒绝,并记录审计日志。对于敏感数据,安全层可在返回结果前执行脱敏或字段过滤。

一个可落地的交互示例

假设某研究团队要接入一批全外显子测序 FASTQ 并完成变异检测。接入层创建任务 ingest-wes-20240512,从测序仪落地目录拉取 48 个 FASTQ 文件,校验 MD5 和样本清单,写入原始区 raw/wes/ds-20240512/v1,发布 dataset.ingested 事件。治理层登记数据集和样本元数据。计算层收到服务层翻译的任务描述,输入原始区数据,使用 fastp:0.23.4 做质控、bwa:0.7.17 比对、gatk:4.5.0 做变异检测,输出写入分析区 curated/vcf/ds-20240512/v1,并发布 job.completed 事件。治理层记录从 FASTQ 到 VCF 的血缘。服务层发布查询 API,允许项目成员按样本标识查询变异结果。安全层在整个过程中校验每次存储读写和 API 调用,确保只有项目成员可访问,且所有访问写入审计日志。

分层设计的判断标准:如果某一层可以独立替换而不影响其他层的契约,说明边界划分合理。例如把计算层的 GATK 换成 DeepVariant,只要任务描述和输出路径协议不变,服务层和治理层无需改动。

常见误区与检查要点

  • 接入层承担过多解释职责:接入层只做搬运和校验,不解析生物学含义;否则格式一变就要改接入逻辑。
  • 存储层按项目建目录:应按数据成熟度和数据集标识组织,项目只是元数据属性,不是路径维度。
  • 计算层保存状态:计算节点应无状态,所有中间结果和最终结果都落存储层,便于重跑和审计。
  • 服务层直连原始文件:应通过存储层访问代理或数据虚拟化层,统一鉴权和审计。
  • 治理层事后补录:元数据和血缘应在事件发生时自动采集,事后补录必然遗漏和失真。
  • 安全层只做登录:安全层必须覆盖每次数据访问和任务执行,而不是只在入口验证身份。

六层参考架构不是唯一答案,但它提供了一套可检查的职责边界和交互协议。落地时可以先从接入层、存储层、计算层三条主通路做起,再逐步补齐服务层、治理层和安全层。关键是:每一层都清楚自己“不做什么”,并通过协议把该做的事交给正确的层。