Quartz 调度程序每秒可以运行的作业数量似乎是有限制的。在我们的场景中,我们每秒有大约 20 个作业以 24x7 的方式启动,quartz 工作良好,达到每秒 10 个作业(对于 JDBC 支持的 JobStore 有 100 个石英线程和 100 个数据库连接池大小),但是,当我们将其增加到 20每秒作业,石英变得非常非常慢,并且其触发的作业与实际预定时间相比非常晚,导致许多Misfires并最终显着降低系统的整体性能。一个有趣的事实是,JobExecutionContext.getScheduledFireTime().getTime()
对于此类延迟触发,它们会在其预定时间之后 10 到 20 分钟甚至更多分钟。
石英调度程序每秒可以运行多少个作业而不影响作业的预定时间,对于这种负载,石英线程的最佳数量应该是多少?
或者我在这里错过了什么?
关于我们想要实现的目标的详细信息:
我们有将近 10k 个项目(分为 2 个或更多类别,在当前情况下我们有 2 个类别),我们需要以给定的频率对其进行一些处理,例如 15,30,60... 分钟,这些项目应在该频率内处理每分钟给定的油门。例如,假设 60 分钟频率,每个类别的 5k 个项目应以每分钟 500 个项目的节流进行处理。因此,理想情况下,这些项目应在一天中每小时的前 10 (5000/500) 分钟内处理,每分钟有 500 个要处理的项目均匀分布在每分钟的每一秒内,因此我们将有大约 8-一个类别每秒 9 个项目。
现在为了实现这一点,我们使用 Quartz 作为调度程序来触发处理这些项目的作业。但是,我们不会在 Job.execute 方法中处理每个项目,因为每个涉及 Web 服务调用的项目处理需要 5-50 秒(平均为 30 秒)。我们宁愿为JMS队列上的每个项目处理推送一条消息,并且单独的服务器机器处理这些作业。我注意到 Job.execute 方法所花费的时间不超过30 毫秒。
服务器详情:
Solaris Sparc 64 位服务器,具有 8/16 核/线程 cpu,用于调度程序,具有 16GB RAM,我们在调度程序集群中有两台这样的机器。