Dou*_*eri 12 java quartz-scheduler
我正在构建一个系统,用户可以在日历中设置未来日期(小时和分钟).在该日期,触发器调用某个任务,对每个用户都是唯一的.
每个用户都可以设置不同的日期.系统从一开始就有10k +,用户可以创建多个触发器.
假设我有10k用户,每个用户平均创建3个触发器=> 30k触发器,具有30k不同的日期.
所有日期都保存在数据库中.
我是石英新手,可以用更优化的方式完成吗?
我正在考虑每分钟运行一个任务,它将获得将在下一个小时内运行的任务并将其从数据库中删除.
你有更好的想法吗?是否有人使用石英作为大量触发器.
您在数据库中备份了计划.如果我理解这个想法 - 你希望石英加载所有即将到来的任务,以便将来执行它们.
这是有问题的方法:
同步问题:我假设用户可以编辑,删除新任务并将新任务添加到数据库.您必须定期要求数据库刷新石英作业的状态,删除一些作业,编辑其他作业等.这可能不是微不足道的.程序的状态将是一个需要经常同步的长生存缓存.
性能和可伸缩性问题:即使提议的解决方案可能适用于30K任务,也可能不适合70k或700k任务.在你的方法中,它不容易扩展 - 添加新机器需要额外的同步层 - 哪台机器应该实际执行哪个工作(因为它们都具有所有任务).
我建议的是什么:
组件:
任务查找器:定期执行(每隔几秒一次).扫描数据库以查找"新"的任务,并尽快到期.将找到的任务发送到Message Queue,并将任务标记为db中的"排队".标记为"排队"必须小心,因为可能有多个"任务查找器".(作为一个补充,它可能会发现超过N分钟前被标记为"排队"或"正在运行"的任务并且没有"完成"或"取消" - 可能需要重新运行这些任务)
消息队列:Taks Finder和Task Executor之间的连接器.
任务执行程序:侦听消息队列并处理它收到的任务.最初将任务标记为"正在运行",稍后将其"完成"或"失败".
使用这种方法,您可以:
这可能无法解决所有情况,但可能是一个很好的起点.
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |