Firefly v1.0.4
发布日期:2026-08-04
v1.0.4 聚焦大规模同刻到期任务的调度性能与可靠性。经过核心慢路径分析,Scheduler 的 JDBC 写入从逐任务事务改为有界批量原子事务;本地 PostgreSQL 16.14 环境中,50,000 个同一时刻到期任务的调度清空时间由 477.068s 降至 3.572s。
构件发布状态
v1.0.4 源码 tag 和 Maven Central 构件尚未发布。生产依赖升级前,请在 Central Portal 确认 1.0.4 已完成索引。
压测边界
本次压力测试覆盖 JDBC Store、Scheduler、Execution/Outbox 事务写入、并发 claim 和结果确认,不包含真实业务 Handler 的 CPU、网络和第三方依赖耗时。
核心优化
- 新增批量调度仓储边界,Scheduler 默认按 200 条拆分有界事务。
- cursor CAS、execution insert、outbox insert 使用 JDBC batch。
- 一批任务只借用一次 Connection、查询一次数据库时间并提交一次事务。
FORBID并发策略由逐任务活动查询改为每批一次集合查询。- shard lease owner、fencing token、cursor CAS 和 execution/outbox 原子性保持不变。
- 新增
firefly.scheduler.batch-size/FIREFLY_SCHEDULER_BATCH_SIZE,默认 200。
优化结果
所有任务先注册到未来时间,注册完成后再统一设置为同一个近未来时刻,因此调度指标不包含任务注册耗时。
| 任务数 | 优化前调度 | 优化后调度 | 优化后吞吐 | 提升 |
|---|---|---|---|---|
| 5,000 | 41.399 s | 0.906 s | 5,518.76/s | 45.7x |
| 10,000 | 101.295 s | 0.937 s | 10,672.36/s | 108.1x |
| 20,000 | 214.172 s | 1.869 s | 10,700.91/s | 114.6x |
| 50,000 | 477.068 s | 3.572 s | 13,997.76/s | 133.6x |
调度延迟
| 任务数 | p50 | p95 | p99 | max |
|---|---|---|---|---|
| 5,000 | 199 ms | 210 ms | 213 ms | 214 ms |
| 10,000 | 204 ms | 213 ms | 216 ms | 216 ms |
| 20,000 | 427 ms | 454 ms | 456 ms | 458 ms |
| 50,000 | 886 ms | 927 ms | 932 ms | 936 ms |
完整性
50,000 任务最终结果:
firefly_job=50,000SUCCEEDED=50,000DONE=50,000- duplicate claims / execution IDs / outbox IDs 均为 0
- 未推进任务游标和非终态 outbox 均为 0
5,000 任务竞争拓扑也通过:8 个 Scheduler 同时竞争全部任务时,调度清空 1.769s,无任务丢失或重复,验证了 CAS 与 fencing 语义。
资源观测
| 50K 指标 | 观测值 |
|---|---|
| JVM heap 峰值 | 731.4 MiB |
| Java Working Set 快照 | 928.1 MiB |
| Java Private 快照 | 1,220.8 MiB |
| PostgreSQL CPU 快照 | 501.86% |
| PostgreSQL Memory 快照 | 690.8 MiB |
| PostgreSQL 主要等待 | WALWrite / WALSync |
优化后 PostgreSQL 能使用更多 CPU 并批量写入 WAL,Scheduler Java 线程不再被逐任务事务往返长期阻塞。50K 总耗时为 242.239s,其中任务逐条注册 191.358s、Outbox 完成模拟 46.004s,Scheduler 已不再是首要瓶颈。
配置
firefly.scheduler.batch-size=200
firefly.scheduler.max-due-records-per-tick=10000
firefly.scheduler.max-idle-wakeup=PT0.5S批次不应无限增大。更大批次会增加事务时长、回滚成本和 lease 过期风险;建议结合数据库 WAL、JDBC pool 和调度延迟 SLO 调整。
验证
- 100、5K、10K、20K、50K PostgreSQL 压测全部通过。
- 新增部分 CAS 失败、
FORBID、整批 rollback 测试。 gradle test全模块通过,覆盖 Scheduler、JDBC、Outbox、Server、Netty 和远程 Executor 链路。
完整过程、命令、资源数据和原始 JSON 见源码仓库 docs/stress-test-v1.0.4.md。