1. 需求澄清
本需求不是客户直接提出的功能诉求,而是 DMTX/Iemail 内部成本优化诉求:当前 Iemail 使用阿里云 MongoDB 单独存储邮件发送数据,发送记录占用大量磁盘,后续仅通过扩容无法长期满足 DMD 全部客户增长。
| 用户 | 关注点 | 方案影响 |
|---|---|---|
| 客户运营 | 报表可看、近期明细可下载、老数据有解释 | 近期体验保持不变,超期明细变为申请/异步下载 |
| DMTX 客服/实施 | 能排查客户问题,有明确数据可用范围 | 提供热/冷数据状态和查询路径 |
| 研发运维 | 降低 MongoDB 磁盘和备份压力 | 建立归档、校验、清理、回滚机制 |
| 财务/管理 | 降本可量化 | 按集合空间和保留周期估算节省 |
2. 现状与容量分析
DMTX 报告下载入口主要从本地 PG 的 contact_dmd_log 导出;Iemail 的磁盘大头在 MongoDB 的 send_record_*,其中保存发送记录、状态、供应商响应、收件人和邮件内容等大字段。
384.32 GB当前 CSV 统计总集合空间
342.04 GB
send_record_* 集合空间89.00%
send_record_* 占总集合空间比例85.93 GB
send_record_* 可回收空间| 分类 | 集合数 | 集合空间 | 占总集合空间 | 可回收空间 |
|---|---|---|---|---|
send_record_* | 62 | 342.04 GB | 89.00% | 85.93 GB |
events_* | 62 | 11.69 GB | 3.04% | 0.15 GB |
open_report | 56 | 0.35 GB | 0.09% | 0.05 GB |
mail_link | 53 | 0.64 GB | 0.17% | 0.02 GB |
rtjourney_log_* | 221 | 17.50 GB | 4.55% | 0.70 GB |
结论:磁盘治理主目标应是 send_record_*,尤其是大字段瘦身、历史归档、字段裁剪、物理空间释放;events_* 虽占比较低,但支撑报表和 DMTX 回收,不能粗暴删除。
3. 竞品调研
| 产品 | 近期明细 | 长期统计 | 明细留存口径 | 导出策略 |
|---|---|---|---|---|
| Mailchimp Marketing | 支持 campaign email activity 查询 | 支持报告统计 | campaign 明细官方未明确;list activity 聚合最多 180 天 | 支持报告下载 |
| Mailchimp Transactional | 支持 outbound activity/search/export | 总体统计永久 | 邮件正文 30 天,bounce 详情 90 天 | 导出链接 7 天过期 |
| Brevo | 支持 event/log/report | 支持统计报告 | 超过 1000 万事件后,24 个月以上事件删除;企业可 10 年 | 建议定期导出/API 导出 |
| ActiveCampaign | 支持 campaign report 明细导出 | 支持 campaigns performance | archived contact 历史互动数据一年后自动删除 | CSV 导出用于内部留档 |
DMTX 不建议直接采用“超过 6 个月完全不可查”的硬删除体验。建议采用三层策略:0-3 个月热数据保持现有体验;3-6 个月温数据仍可查但导出异步化;6 个月以上默认不提供在线逐条明细,改为归档异步下载和聚合统计。
4. 用户体验设计
| 数据年龄 | 页面报表 | 明细列表 | 原始数据下载 | 用户提示 |
|---|---|---|---|---|
| 0-3 个月 | 实时/准实时 | 可查 | 可立即/异步下载 | 无特殊提示 |
| 3-6 个月 | 可查 | 可查但可能较慢 | 异步下载 | 历史数据正在生成,完成后邮件通知 |
| 6-24 个月 | 聚合统计可查 | 默认不展示逐条明细 | 申请后异步下载 | 超过 6 个月的逐条明细将从归档数据生成 |
| 24 个月以上 | 默认仅保留聚合摘要 | 不提供 | 企业服务单独处理 | 超长期明细需联系客户成功确认保留范围 |
核心流程
- 客户在报告下载页选择活动、数据类型、时间范围。
- 系统自动判断热库、冷库或混合范围;如包含归档数据,提示生成时间较长。
- 客户点击导出/申请导出,文件生成后通过邮件通知,下载链接默认 7 天有效。
默认值
| 热数据保留 | 3 个月 | 保证近期体验 |
|---|---|---|
| 明细在线保留 | 6 个月 | 超过 6 个月默认不提供逐条在线明细 |
| 冷库归档保留 | 24 个月 | 对齐 Brevo 高事件量策略,可评审调整 |
| 企业延长保留 | 可配置,最长 10 年 | 对标 Brevo Enterprise |
| 归档观察期 | 7-14 天 | 归档完成后不立即删除热库,便于回退 |
5. 技术方案
阿里云 MongoDB 热库
├─ send_record_* 0-3/6个月热明细
├─ events_* 事件明细,供 DMTX 回收和报表
├─ mail_link 链接字典
└─ open_report 聚合报表
│ DTS/归档任务同步
▼
扬州机房冷库/归档存储
├─ iemail_archive.send_record_yyyyMM
├─ iemail_archive.events_yyyyMM
├─ iemail_archive.mail_link_snapshot
├─ iemail_archive.open_report_snapshot
└─ archive_manifest / archive_job
│ 历史导出服务
▼
DMTX/Iemail 下载任务
├─ 热数据:走现有 DMTX contact_dmd_log 或 Iemail Mongo 查询
├─ 冷数据:走扬州冷库生成文件
└─ 混合范围:热冷拆分后合并 zip/CSV
方案一:减少发送记录热库存储
- 新写入
send_record_*只保存发送排查和列表需要的字段。 - 大字段
content写入对象存储或冷库,Mongo 仅保存contentHash、contentObjectKey、contentSize。 - 供应商完整响应短周期保留,长期只保存
statusCode、错误分类和摘要。 - 历史数据先归档整条原始记录,校验后再
$unset大字段或删除超期明细。
方案二:历史数据冷处理
- DTS 负责从阿里云 MongoDB 到扬州机房的基础同步。
- 自研 Archive Orchestrator 按公司、集合、月份创建归档批次。
- 自研校验任务执行记录数、hash、抽样字段校验,校验通过后才允许热库清理。
- 自研历史导出服务屏蔽热库/冷库差异,为 DMTX 下载入口提供统一能力。
6. 数据模型与 API
核心数据模型
| 表/模型 | 关键字段 | 用途 |
|---|---|---|
iemail_archive_job | company_sn, database_name, collection_name, collection_type, archive_month, source_count, archive_count, status | 记录归档任务状态和清理水位 |
iemail_archive_manifest | archive_job_id, archive_path, min_object_id, max_object_id, min_event_ts, max_event_ts, retention_until | 保证每批归档可审计、可追溯 |
iemail_retention_policy | hot_retention_days, online_detail_days, archive_retention_months, content_hot_days, cleanup_grace_days | 支持全局和租户级保留策略 |
iemail_export_request | company_sn, send_task_ids, event_types, start_time, end_time, source_mode, status, file_url | 管理历史导出任务 |
核心 API
GET /inner-api/iemail/v1/data-availability
POST /inner-api/iemail/v1/archive-export-requests
GET /inner-api/iemail/v1/archive-export-requests/{requestId}
POST /inner-api/iemail/v1/archive-jobs
POST /inner-api/iemail/v1/archive-jobs/{jobId}/cleanup
7. 边界情况
| 边界情况 | 风险 | 处理策略 |
|---|---|---|
| DTS 延迟或中断 | 冷库数据不完整,误删热库 | 清理必须依赖 archive manifest 校验通过,不能只看 DTS 状态 |
| 归档期间有迟到事件 | events_* 迟到写入导致冷库缺数据 | 归档窗口增加 7 天 safety lag;按 eventTs + consumedAt 双条件校验 |
| 混合时间范围导出 | 热冷数据重复或漏数 | 按时间边界拆分,使用 sendId/eventId 去重 |
mail_link 缺失 | 点击导出无法还原链接标题 | 跟随 sendTaskId 快照,缺失时退化展示 URL/linkId |
| Mongo 删除后空间不下降 | 成本没有立刻降低 | 需要 compact、集合重建或实例迁移释放物理空间 |
| 客户合同要求长期明细 | 默认策略不满足 | 支持租户级 retention policy 和企业延长保留 |
8. DMTX 报告下载事实源边界
DMTX 报告下载默认继续以 contact_dmd_log 为事实源。本次 Iemail send_record_* 磁盘治理不应默认改变 DMTX 现有原始数据导出口径,否则会引入字段映射、事件去重、统计口径和导出列不一致风险。
- 纯 DMTX 可用范围:继续从
contact_dmd_log导出。 - Iemail 冷库:仅作为
contact_dmd_log不可用、已归档或需要补齐 Iemail 原始发送明细时的补充/兜底路径。 - 混合范围:默认打包为独立 CSV,明确标注“DMTX 原始数据”和“Iemail 归档补充数据”,不静默合并。
- 上线前必须完成
events_*/send_record_*到contact_dmd_log导出字段的映射、去重规则和抽样对账。
9. 实施计划与工作量
| 阶段 | 时间 | 工作内容 | 预期收益 |
|---|---|---|---|
| 阶段 0:评审与数据确认 | 本周 | 确认客户承诺、DTS 网络权限、冷库形态、Top 字段采样 | 形成可落地范围 |
| 阶段 1:快速止血 | 1-2 周 | 释放可回收空间、开启新写入瘦身、增加容量日报 | 控制新增膨胀 |
| 阶段 2:冷归档 MVP | 3-5 周 | DTS 链路、归档模型、单客户单月份试点、校验 | 证明冷库可下载可排查 |
| 阶段 3:热库清理与下载路由 | 5-8 周 | DMTX 接入 data availability,Iemail hot/cold/mixed reader,字段裁剪和物理释放 | 显著降低热库空间 |
| 阶段 4:产品化 | 后续 | 租户级策略、企业延长保留、客服后台、自动审计 | 长期治理闭环 |
从 MVP 到可灰度预计 44-67 人日。
10. 本周评审决策点
| 决策点 | 建议结论 | 不确认的风险 |
|---|---|---|
| 客户/合同是否承诺长期逐条明细 | 默认不承诺 6 个月以上在线逐条明细,提供异步归档导出 | 清理后可能违反客户承诺 |
contact_dmd_log 保留周期 | 先确认 PG 现有归档策略,再决定是否单独冷归档 | DMTX 下载和 Iemail 冷库口径冲突 |
| 冷库形态 | MVP 优先 MongoDB/兼容 Mongo,后续评估 Parquet/对象存储 | 查询与导出改造成本不可控 |
| DTS 到扬州机房可行性 | 本周确认网络、权限、延迟、费用和失败告警 | 归档链路无法落地 |
content 正文保留 | 允许 30 天后从热库删除或对象存储化 | send_record_* 新增空间继续膨胀 |
| 默认冷库保留期 | 默认 24 个月,企业客户可配置更长 | 保留周期无产品边界,成本不可控 |
11. 推荐结论
推荐采用“两条线同时推进”的组合方案:
- 产品策略线:0-3 个月热明细、3-6 个月温明细、6 个月以上归档异步下载,长期保统计摘要。
- 技术治理线:以
send_record_*为主目标,先归档再裁剪/删除,配合 compact/集合重建释放物理空间。 - 体验保护线:DMTX 报告下载保持现有入口,系统自动判断热/冷数据,客户只感知“历史数据生成较慢”。
- 商业弹性线:默认冷库保留 24 个月,企业客户可购买或配置更长留存。
12. 质量自检
| 检查项 | 得分 | 说明 |
|---|---|---|
| 需求背景清晰 | 3/3 | 明确内部成本优化、本周评审、全场景覆盖 |
| 竞品调研充分 | 4/4 | 调研 Mailchimp、Brevo、ActiveCampaign,区分明细和统计 |
| 用户体验设计 | 4/4 | 给出 0-3/3-6/6+ 月用户路径、提示、默认值 |
| 技术架构可落地 | 4/4 | 基于现有 DMTX/Iemail 源码链路设计热冷路由 |
| 数据模型与 API | 6/6 | 字段级模型和接口出入参明确 |
| 边界、工作量、回退 | 10/10 | 覆盖 DTS 延迟、迟到事件、混合导出、物理释放、观察期回退 |
| 总分 | 31/31 | 通过,超过 20 分提交标准 |