Repository navigation
v0.2.0:任务 ID 冲突处理与并发入队增强
更新内容
- 默认任务 ID 保持为完整 128 位随机数生成的 32 位十六进制字符串,不拼接时间戳,继续兼容已有 ID 和自定义 ID。
- 每次未指定 ID 的主动投递均创建独立任务,相同业务参数不自动合并;原任务重试继续沿用 ID。
- 原子入队明确区分新建任务与 ID 已占用;自动生成 ID 冲突时最多生成 5 次,耗尽后抛出
JobIdConflict。 - 自定义活动任务 ID 仅对相同任务类、JSON 业务参数和执行选项去重;内容不同或原消息损坏时抛出
JobIdConflict,不覆盖旧任务。 - 去重忽略创建时间及 JSON 对象键顺序,保留原有延迟安排和尝试次数;JSON 值类型及数组顺序仍需一致。
Queue构造函数支持可选 ID 生成闭包;Redis 超时及其他结果不明的写入仍直接报告异常,不换 ID 自动重发。- 增加多进程 ID 碰撞、并发去重与冲突、有限重试、旧 ID 重放及入队响应丢失的回归测试和中文说明。
- 补充任务 ID 用途、命令参数、统计字段和队列配置的中文说明。
从 0.1 升级
- PHP 8.2+、ThinkPHP 8、Redis 6.2+ 的要求不变;已有合法任务 ID 和 Redis 消息无需迁移。
- 使用
composer require panda-men/think-queue-stream:^0.2升级;Composer 的^0.1约束不会自动升级到 0.2。 - 相同自定义 ID 的不同任务现在会抛出
Exception\JobIdConflict,原来依赖静默去重的调用方应处理此异常。 - 相同业务主动重新执行时,不传固定 ID,让队列生成新任务 ID;仅在需要活动任务去重时显式指定 ID。
- 发布代码后重新启动生产者常驻进程和队列消费者,确保新入队规则生效。
验证
- 隔离 Redis 7.2 上全量 55 项测试、530 次断言通过。
- PHP 8.2/8.3/8.4 × Redis 6.2/7.4 的 GitHub Actions 矩阵通过。
- PHP 8.2/8.4 语法检查、Composer strict validate 和 git diff --check 通过。
合并记录:#2
完整变更:v0.1.0...v0.2.0