计划动作积压会拖垮 Odoo 19 白天交互:用户觉得「系统卡」,其实是 ir.cron 的 nextcall 过期队列在抢锁打满 CPU。运维要把「过期 cron 数」当成核心指标;长任务拆队列;并行用锁挡住。本文给出盘点方法、错峰策略、锁与幂等、监控报表。
盘点
设置 → 技术 → 自动化 → 计划的动作。看间隔、下次执行、执行用户、代码是否触碰重模型(会计过账、全量重算)。优先处理 nextcall 已过期仍堆积的条目;禁用无人认领的老脚本。
错峰
报表汇总、附件清理、邮件队列、对账放到低峰;白天只留短任务。多 cron 抢锁时,重任务改成「入队 + worker 消费」。避免全部挤在整点 00 分。
锁与幂等
长任务开头用数据库锁或「运行中」标记;失败指数退避。业务写入必须幂等:重复跑不产生第二张发票/第二笔 stock.move。与自定义 cron 文同一原则,只是治理视角偏运维。
监控
日报:过期数量、单次最长耗时、失败次数。超阈值告警到运维频道;月度回顾谁的脚本最耗时。
验收标准
- 人为暂停后恢复,业务单据不重复。
- 低峰任务不在上班高峰打满 CPU。
- 过期 nextcall 有看板或日报。
Cron 责任人制度
每条启用的 ir.cron 在描述或文档表登记:业务用途、责任人、可接受最长耗时、
失败影响面。无责任人的 cron 默认禁用。周报看过期 nextcall 数量与 Top 耗时;
超过阈值的脚本要么拆队列,要么改间隔。手工「立即运行」生产 cron 需双人复核,
尤其是会生成 account.move 或批量邮件的任务。
对「全表重算」类 cron 强制加锁并改到凌晨;白天只允许增量。
积压爆发时的应急步骤
1)列出 nextcall 过期的 ir.cron Top N;2)暂停非关键重任务;
3)保证短任务与用户交互恢复;4)低峰再放行重任务或改入队;5)复盘为何堆积(发版后新脚本?锁等待?外部慢)。
日常用只读 SQL/报表看平均时长。禁止在生产对重 cron 连续点「立即运行」。责任人制度见上文,
无主责脚本禁用。
数据库维护窗口与 cron 错峰,避免 VACUUM/备份与全表重算重叠。
cron 变更纳入发版说明,禁止生产库临时改 interval 却不记单。
预生产勾选表需覆盖文章编号 327 全部验收点后再约生产窗口。
将文章编号 327 的配置变更记入发版说明,便于回滚对照。
将文章编号 327 的配置变更记入发版说明,便于回滚对照。
将文章编号 327 的配置变更记入发版说明,便于回滚对照。
将文章编号 327 的配置变更记入发版说明,便于回滚对照。
应急与发版联动
积压应急:暂停重任务、保交互、低峰回放。cron 变更写进发版说明。无主责禁用。 禁止生产连续「立即运行」重任务。全表重算仅凌晨。维护窗口与备份错峰。 周报 Top 耗时脚本约谈责任人,能拆队列的拆。
落地备忘(327-0):把本文验收项做成检查表,预生产逐条勾选并附截图;生产窗口前提交负责人签字。相关模型与字段以当前 Odoo 19 实例开发者模式显示为准。
落地备忘(327-1):把本文验收项做成检查表,预生产逐条勾选并附截图;生产窗口前提交负责人签字。相关模型与字段以当前 Odoo 19 实例开发者模式显示为准。
落地备忘(327-2):把本文验收项做成检查表,预生产逐条勾选并附截图;生产窗口前提交负责人签字。相关模型与字段以当前 Odoo 19 实例开发者模式显示为准。
中国Odoo网|对照 Odoo 19 企业版 Cron 治理:盯 nextcall 积压,错峰与互斥,长任务拆队列。