-- 停止旧服务后迁移;未终结任务包含等待、预占、运行和待核查,不能因重试重复计数。 -- 无数据库外键。额度与任务状态由服务端在同一队列事务内维护。 ALTER TABLE pulse_queues ADD COLUMN max_unfinished_tasks INT UNSIGNED NOT NULL DEFAULT 100000 COMMENT '队列允许积压的未终结任务上限;降额不删除已有任务', ADD COLUMN unfinished_tasks BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '未终结任务数,包含待核查;受理增加、首次进入终态减少,重试不重复计数', ADD COLUMN start_window_until DATETIME(6) NULL COMMENT '数据库时间的一秒开始限流窗口结束时刻;空表示尚未开始计数', ADD COLUMN starts_in_window INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '当前窗口已提交的开始授权次数,回执重报不重复计数,降额不清零', ADD CONSTRAINT ck_queue_unfinished_limit CHECK (max_unfinished_tasks > 0), ADD CONSTRAINT ck_queue_start_window CHECK (start_window_until IS NOT NULL OR starts_in_window=0); UPDATE pulse_queues q LEFT JOIN ( SELECT namespace_id,queue_id,COUNT(*) AS unfinished FROM pulse_tasks WHERE state IN ('WAITING','LEASED','RUNNING','NEEDS_REVIEW') GROUP BY namespace_id,queue_id ) t ON t.namespace_id=q.namespace_id AND t.queue_id=q.id SET q.unfinished_tasks=COALESCE(t.unfinished,0);