内容提要
DB-Scheduler是一款基于数据库的Java任务调度库,仅需一张表即可实现集群部署和任务持久化,吞吐量可达每秒2000至10000次。它采用乐观锁和心跳机制管理任务,但存在长任务重复执行、不支持毫秒级精度、缺乏监控等局限。相比Quartz的11张表,它更简洁高效,适合简单场景,但复杂需求下可能成为瓶颈。
延伸解读
一张表背后的取舍
db-scheduler用一张表简化了调度模型,但代价是功能上的限制。它不支持毫秒级精度,默认10秒轮询一次;没有内置监控和告警,失败重试、死信队列等都需要自己实现。选择它意味着接受这些取舍,适合对调度要求不高的场景。
长任务重复执行的风险
心跳机制存在漏洞:任务执行时间过长时,心跳不更新,其他节点可能误判任务死亡并重新执行,导致重复。官方承认不同轮询策略处理方式不同,但问题仍未完全解决。使用长任务时需谨慎,可能需要额外机制避免重复。
性能数字的适用条件
官方宣称吞吐量每秒2000到10000次,但实际受数据库类型、网络延迟、任务时长等因素影响。例如,有团队用SQL Server跑,80线程一小时仅处理340个任务。高性能需配合lock-and-fetch策略,且并非所有数据库都支持。性能数字仅供参考。
动态任务的局限性
动态循环任务注册后无法停止,全局stop后不能重启。失败处理需自己写,社区扩展ui功能有限。若需要灵活的任务生命周期管理或复杂工作流,db-scheduler可能不够用。
Q&A
DB-Scheduler是什么?它和Quartz相比有什么优势?
DB-Scheduler是一个基于数据库的Java任务调度库,只需一张数据库表即可实现集群部署和任务持久化。相比Quartz需要11张表,它更简洁,配置简单,吞吐量可达每秒2000到10000次。
DB-Scheduler如何保证在集群中只有一个节点执行同一个任务?
DB-Scheduler使用乐观锁机制。多个节点同时扫描任务表,发现到期的任务时尝试更新picked字段,更新成功的节点获得执行权,其他节点看到picked已被占用则放弃。同时使用version字段进行乐观锁控制,避免冲突。
DB-Scheduler的心跳机制是如何工作的?它有什么潜在问题?
节点领走任务后,会定期更新last_heartbeat字段。其他节点发现任务被picked但心跳很久未更新时,会认为节点已死并重新执行任务。默认每10秒扫描一次,心跳间隔5分钟,连续错过6次心跳判定死亡。但长任务执行期间心跳不更新,可能导致其他节点误判并重复执行任务。
DB-Scheduler支持哪些任务类型?
DB-Scheduler支持三种任务类型:简单循环任务(固定周期执行)、一次性任务(在未来某个时间点执行一次,可携带数据)、动态循环任务(运行时动态注册并按周期执行)。
DB-Scheduler的吞吐量能达到多少?实际使用中受哪些因素影响?
官方宣称吞吐量可达每秒2000到10000次,但实际受数据库类型、网络延迟、任务执行时长等因素影响。例如,有团队用SQL Server跑,80个线程一小时只能处理340到360个任务。使用lock-and-fetch策略可提升性能,但并非所有数据库都支持。
DB-Scheduler有哪些局限性?
局限性包括:不支持毫秒级精度(默认10秒扫描一次,1秒是极限);只支持关系型数据库;没有内置监控和告警;某些数据库功能支持不完整(如MySQL 8.0以下不支持降序索引,优先级功能不可用);无法实现负载均衡;任务失败重试、死信队列等需要自己实现。
DB-Scheduler适合哪些场景?不适合哪些场景?
适合不想被Quartz折磨、不需要企业级调度功能的团队,适合云上节点频繁扩缩容的微服务,适合追求简洁的项目。不适合任务执行时间长、对负载均衡有严格要求、需要完善监控告警的系统。
DB-Scheduler有哪些实际生产案例?
GitHub上列出的生产用户包括挪威的电子邮箱服务商Digipost、北欧交通集团Vy Group,以及Wise和TOMRA。但官方未公布具体使用细节。DoorDash的实习生项目也使用了DB-Scheduler,并认为其数据模型更简单、扩展性比Quartz好。