← 返回博客

定时批量生成 PDF:月报、账单与证书的任务调度方案

如果你正在搜索“定时生成 PDF”“批量 PDF 生成”“Scheduled PDF”,真正需要的通常不是临时导出,而是一套能处理真实数据、稳定版式和持续交付的文档流程。

每月第一天生成账单、每周一发送报告、活动结束后颁发证书,本质都是定时或事件驱动的批量任务。PDF API 负责渲染,调度、队列和状态则由业务系统负责。

本文面向 需要周期性生成客户账单、报告、证书、工资单或运营文件的后端、平台与数据工程团队。目标是用可重放、可监控的任务架构控制数据快照、批次、幂等、失败恢复、存储和最终投递,最终交付月度账单、客户报告、周期对账单、证书批次、工资单、库存报告和定时业务文档,并让每份文件都能追溯到明确的数据与模板版本。

一、这个 PDF 场景真正难在哪里?

定时任务最大的风险不是某次变慢,而是重复生成、漏生成或使用变化中的数据。一个凌晨任务若中途失败,没有批次清单和幂等键,就难以知道哪些客户已经完成。

二、先建立字段与数据边界

开始设计页面前,至少要梳理以下数据:

三、从业务数据到正式 PDF 的实施流程

第1步:定义时区、触发时间、截止规则和数据快照

先把“定义时区、触发时间、截止规则和数据快照”写成团队可执行的规则,明确数据负责人、批准人和异常处理人。对于月度账单、客户报告、周期对账单、证书批次、工资单、库存报告和定时业务文档,这一步越清楚,后续模板返工越少。

第2步:按模板和文档类型拆分任务并建立输入清单

处理“按模板和文档类型拆分任务并建立输入清单”时,记录选择依据并保存一份代表性样本。以后调整模板或接口时,可以用相同依据重新验证。

第3步:将大批量切成有上限的小批次进入队列

围绕“将大批量切成有上限的小批次进入队列”准备正常、空值、最长文本和最大数组四类数据,确认页面在真实边界下仍然完整可读。

第4步:Worker 调用 KeepMot API 并校验 PDF 响应

执行“Worker 调用 KeepMot API 并校验 PDF 响应”时,为请求设置业务标识、超时和明确失败分支;只有文件通过验收后,才把动作标记为成功。

第5步:原子保存文件与状态并对瞬时失败有限重试

验收“原子保存文件与状态并对瞬时失败有限重试”不能只看屏幕第一页,还要检查打印、跨页、字体、条码或交互状态等与场景有关的细节。

第6步:汇总完成率、失败原因、页数成本和投递结果

最后以“汇总完成率、失败原因、页数成本和投递结果”形成追溯闭环,保存业务 ID、模板版本、生成时间、页数和文件摘要,方便补发与审计。

四、三个必须提前做出的设计决定

1. Cron 直接生成还是只入队

调度器最好只创建任务和快照,实际渲染由可扩展 Worker 队列执行,避免一次超时丢失整个批次。

2. 批次大小如何确定

根据平均页数、文件大小、内存、超时和下游存储测试决定,不能只按记录数量。

3. 失败后重算还是重放

重放应使用原 snapshot_id 与模板版本,避免恢复任务时数据已经变化。

五、如何使用 KeepMot 落地

KeepMot 的 Template API 接收 data 数组并将记录按顺序渲染合并,适合小型批次;更大任务可由外部队列拆成多次调用。API 按成功生成页数记录成本,失败请求需按状态码分类处理。

针对 定时生成 PDF,可以在 KeepMot Studio 中维护视觉模板,通过 Template API 只提交 template_id 和业务数据;完全由程序控制版式时使用 JSON Render API,已有网页资产时选择 HTML to PDF API。模板库可从 这里 查看。

六、上线验收清单

  1. 调度时区与业务期间正确:保存源系统核对记录作为证据。
  2. 快照和模板版本已冻结:保存页面或打印样本作为证据。
  3. 每个记录有幂等键:保存边界数据结果作为证据。
  4. 批次清单与输出数量一致:保存响应状态与文件头作为证据。
  5. 失败按类型有限重试:保存模板版本和文件摘要作为证据。
  6. 投递只发生在验收之后:保存补发或重放记录作为证据。

七、常见风险与修正方法

风险 1:Cron 超时后从头重跑造成重复文件

“Cron 超时后从头重跑造成重复文件”会让早期看似灵活的实现快速积累维护成本。应在数据合同或发布流程中直接阻止这种状态。

风险 2:恢复任务时重新查询实时数据

出现“恢复任务时重新查询实时数据”时,最终页面可能仍然看似正常。必须同时核对源记录、关键标识和实际输出。

风险 3:一个巨大 data 数组无法定位坏记录

“一个巨大 data 数组无法定位坏记录”往往只在边界数据出现。把触发条件保存为回归样本,并为无法安全生成的内容返回明确错误。

风险 4:把 4xx 参数错误当瞬时故障重试

“把 4xx 参数错误当瞬时故障重试”可能造成交付、安全或运营事故。限制敏感值的暴露范围,并保留必要审计信息而不记录秘密。

风险 5:生成成功但存储失败却标记完成

针对“生成成功但存储失败却标记完成”,先区分数据、版式、投递和版本问题,再制定纠正、重试、撤销或补发规则。

八、批量、性能与日常运营

监控应关注待处理数量、成功率、各错误码、平均页数、生成延迟和投递积压。告警要指向可操作批次;运维人员能够按 record_id 重放单条,而不是整期重新运行。

九、常见问题 FAQ

Q:KeepMot 自带 Cron 调度吗? A:PDF API 负责生成,调度可由你的云平台、任务系统或工作流工具触发。

Q:一个请求可以放多少记录? A:应根据页面、数据和超时做压力测试。大任务通常拆成有清单的小批次更可靠。

Q:如何避免重复账单? A:用业务记录、期间、模板版本和动作构造幂等键,并原子保存状态。

Q:哪些错误适合重试? A:短暂网络、限流和部分 5xx 可退避重试;认证、余额、参数和模板问题需要先修正。

Q:数据快照为什么重要? A:它保证失败恢复和后续审计仍使用同一期间事实,不因实时数据变化得到不同文件。

Q:如何估算任务成本? A:以记录数乘平均物理页数,再加合理峰值与重试余量;不要只按 API 请求次数计算。

十、总结

可靠批量任务的关键词是快照、清单、幂等、有限重试和可观察性;调度器只负责准时开始,系统必须能够安全结束和恢复。