云平台后端BAM取回思考
背景
当前开发的分析平台,我规划最终文件都储存在S3桶中。为了节省储存费用,我当前的思路是,在整体分析流程,都只采用或者优先采用CRAM,而最终只保留CRAM在桶里。
这样,相对于BAM,预估储存费用约是三分之一。
同时,我计划桶中的CRAM也会在30天后自动销毁或彻底转向冷备。
那么,用户想下载BAM时,有三种方案:
- 后台触发CRAM转换BAM任务,转换成功后,再推送S3下载链接,同时该BAM只保留7天
- 直接向用户提供下载器,该下载器安装后,会在下载前先检测有没有对应的参考基因组存在,如没有,先下载参考基因组,然后再下载CRAM,最后在用户本地电脑进行转换
- 不提供任何的CRAM和BAM文件下载
IGV复核的问题。显然,用户会存在IGV复核这个需求,我们之前给定的30天时间,就是希望用户可以在这30天内完成样本的复核。但是,往往存在超出这个时间的复核需求,我的理解是,这是一个潜在的收费点,即高级订阅可以有更长的CRAM存留时间,而普通用户只能重复分析了。
有另外一个想法,可以在分析完成后,即对SNV、InDel、Fusion等分析结果进行位点提取,然后构建出突变位点前后的一个区域,提取出一个复核用的小型CRAM,这样的一个CRAM文件,甚至可能只有一百多兆,应可永久保存(我觉得不好,因为日积月累,都是成本)。
方案对比分析
方案1:后台转换 + 临时存储
优点:
- 用户体验最好,无需安装任何工具
- 技术门槛低,适合所有用户群体
- 可控性强,转换失败可及时处理
缺点:
- 需要额外的计算资源(EC2/Lambda)
- 临时存储 BAM 会产生额外的 S3 费用
- 高并发时可能需要排队
- 7天后自动删除,用户需要重新申请
成本估算:
- 单次转换计算成本:~$0.01-0.05(取决于文件大小)
- 临时存储成本:30GB BAM × 7天 × 0.16
- 适合场景:临床诊断为主的客户
方案2:客户端下载器 + 本地转换
优点:
- 零后端计算成本,转换在用户本地完成
- 零临时存储成本
- 用户可随时转换,不受时间限制
- 参考基因组可复用,只需下载一次
缺点:
- 需要开发跨平台下载器(Windows/macOS/Linux)
- 用户需要一定技术能力(安装软件、理解命令行)
- 用户本地需要足够磁盘空间(参考基因组 3GB + CRAM 10GB)
- 转换速度取决于用户电脑性能
- 技术支持成本高(各种环境问题)
实现要点:
# 下载器核心逻辑
1. 检测本地是否有参考基因组(~/.cram_ref/hg38.fa)
2. 若无,从 CDN 下载(一次性,3GB)
3. 下载 CRAM 文件(带断点续传)
4. 调用 samtools view -b -T ref.fa -o output.bam input.cram
5. 清理临时文件
适合场景:
- 具备 Linux 基础的生信分析师
- 基础科研用户(需要长期保存数据)
- 对成本敏感的小型团队
方案3:不提供原始数据下载
优点:
- 成本最低,无任何转换和存储开销
- 迫使用户依赖平台分析能力
- 数据安全性最高
缺点:
- 用户体验极差,可能导致客户流失
- 无法满足科研用户的二次分析需求
- 竞争力下降(其他平台都提供下载)
结论: 不推荐,除非是完全封闭的企业内部系统。
IGV 复核的解决方案
核心矛盾
- 用户需求:随时可能需要回看原始数据(尤其是科研场景)
- 平台成本:长期存储全量 CRAM 成本高昂
推荐方案:分层存储 + Micro-CRAM
第一层:热数据(0-30天)
- 完整 CRAM 存储在 S3 Standard
- 支持 IGV 直接通过预签名 URL 流式读取
- 用户可随时复核任意区域
第二层:温数据(31-180天)
- 自动转入 S3 Glacier Instant Retrieval
- 存储成本降低 68%(0.023/GB)
- 毫秒级取回,IGV 仍可直接访问
- 适合高级订阅用户
第三层:冷数据(180天+)
- 生成 Micro-CRAM(仅保留突变位点 ±500bp 区域)
- 文件大小:100-200MB(压缩比 99%+)
- 永久保存成本:$0.004/月
- 满足 90% 的复核需求
Micro-CRAM 生成逻辑
# 从 VCF 提取突变位点,生成 BED 文件
awk '{print $1"\t"$2-500"\t"$2+500}' variants.vcf > hotspots.bed
# 提取指定区域生成 Micro-CRAM
samtools view -T ref.fa -L hotspots.bed -C -o micro.cram full.cram
samtools index micro.cram
# 文件大小对比
# 全量 CRAM: 10GB
# Micro-CRAM: 150MB (仅保留 ~500 个突变位点)
优势:
- 保留了所有关键位点的原始测序数据
- IGV 可正常加载和可视化
- 成本可忽略不计(1000 个样本/年 仅 $48)
局限:
- 无法查看未标注的区域
- 不适合需要重新分析全基因组的场景
商业化策略建议
订阅分层设计
基础版(免费/低价)
- 完整 CRAM 保留 30 天
- 30 天后自动生成 Micro-CRAM 永久保存
- 提供客户端下载器(方案2)
- 适合:个人用户、小型科研团队
专业版
- 完整 CRAM 保留 180 天(Glacier Instant Retrieval)
- 后台一键转 BAM 服务(方案1)
- 优先计算资源
- 适合:临床诊断机构、中型企业
企业版
- 完整 CRAM 自定义保留时长(最长 5 年)
- 专属存储桶 + VPC 直连
- SLA 保障
- 适合:大型医院、药企
关键决策因素
客户画像优先:
-
临床诊断为主 → 方案1(后台转换)+ 短期存储
- 特点:报告周期短(7-14天),复核集中在前30天
- 痛点:不想装软件,要即开即用
-
基础科研为主 → 方案2(客户端下载器)+ Micro-CRAM
- 特点:可能半年后还要重新分析
- 痛点:预算有限,愿意牺牲便利性换成本
-
混合客群 → 分层订阅 + 灵活组合
- 让用户自己选择适合的方案
技术实现要点
1. S3 生命周期自动化
{
"Rules": [
{
"Id": "CRAM-Lifecycle",
"Status": "Enabled",
"Transitions": [
{
"Days": 30,
"StorageClass": "GLACIER_IR"
}
]
}
]
}
2. IGV 流式读取(无需下载)
# 生成预签名 URL(有效期 1 小时)
url = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-bucket', 'Key': 'sample.cram'},
ExpiresIn=3600
)
# 用户在 IGV 中直接加载此 URL
3. 后台转换任务(Lambda + ECS)
# 小文件用 Lambda(<10GB)
# 大文件用 ECS Fargate(>10GB)
def convert_cram_to_bam(cram_key):
subprocess.run([
'samtools', 'view', '-b',
'-T', 'ref.fa',
'-o', 'output.bam',
cram_key
])
s3.upload_file('output.bam', bucket, f'temp/{bam_key}')
# 设置 7 天后自动删除
最终建议
推荐组合方案
阶段一(MVP):
- 采用方案1(后台转换)+ 30天热存储
- 简单快速,用户体验好
- 验证客户真实需求
阶段二(优化):
- 引入 Glacier Instant Retrieval(31-180天)
- 开发 Micro-CRAM 自动生成流程
- 降低 70% 长期存储成本
阶段三(差异化):
- 开发客户端下载器(可选)
- 推出分层订阅
- 根据客户反馈调整策略
成本对比(1000 样本/年)
| 方案 | 月存储成本 | 年计算成本 | 总成本 |
|---|---|---|---|
| 全 BAM 永久保存 | $690 | $0 | $8,280 |
| 全 CRAM 永久保存 | $230 | $0 | $2,760 |
| CRAM 30天 + Micro | 4 | $120 | $444 |
| CRAM 180天 + Micro | 4 | $120 | $720 |
结论: 采用"30天热存储 + Micro-CRAM"可节省 94.6% 的成本。
用户体验保障
无论选择哪种方案,必须做到:
- 透明告知:清楚说明数据保留策略
- 提前提醒:数据即将转冷前 7 天邮件通知
- 一键恢复:Glacier 数据可付费快速恢复
- 文档完善:客户端工具提供图文教程
- 技术支持:7×24 小时响应
核心思路: 不是"省钱 vs 体验"的二选一,而是通过技术手段(CRAM + 分层存储 + Micro-CRAM)实现"省钱且体验好"。