Кажется, существует ограничение на количество заданий, которые планировщик Quartz может запускать в секунду. В нашем сценарии у нас около 20 рабочих мест в секунду, работающих в режиме 24x7, и кварц хорошо работал до 10 рабочих мест в секунду (с 100 потоками кварца и 100 пулами подключений к базе данных для поддерживаемого JDBC JobStore), однако, когда мы увеличили его до 20 рабочих мест в секунду, кварц стал очень медленным, и его запущенные рабочие места были очень запоздалыми по сравнению с их фактическим запланированным временем, вызвавшим много промахов и в конечном итоге значительно снижающим общую производительность системы. Интересным фактом является то, что JobExecutionContext.getScheduledFireTime().getTime()
для таких отложенных триггеров составляет 10-20 и еще больше минут после их графического времени.
Сколько заданий планировщик кварца может выполняться в секунду, не влияя на запланированное время выполнения заданий и каково должно быть оптимальное количество кварцевых потоков для такой нагрузки?
Или я что-то пропустил?
Подробная информация о том, чего мы хотим достичь:
У нас есть почти 10 тыс. позиций (категория из 2 или более категорий, в данном случае у нас есть 2 категории), по которым нам нужно выполнить некоторую обработку с заданной частотой, например. 15,30,60... минут, и эти предметы должны обрабатываться с этой частотой с заданным дросселем в минуту. например скажем, в течение 60 минут частота 5 тыс. единиц для каждой категории должна обрабатываться с дроссельной заслонкой по 500 штук в минуту. Таким образом, в идеале эти предметы должны обрабатываться в течение первых 10 (5000/500) минут каждого часа дня с каждой минутой, имея 500 обрабатываемых предметов, которые распределяются равномерно через каждую секунду минуты, поэтому у нас будет около 8- 9 единиц в секунду для одной категории.
Теперь для этого мы использовали Quartz в качестве планировщика, который запускает задания для обработки этих элементов. Однако мы не обрабатываем каждый элемент с помощью метода Job.execute, потому что потребуется 5-50 секунд (усреднение до 30 секунд) на обработку элемента, которая связана с вызовом webservice. Мы скорее нажимаем сообщение для каждой обработки элементов в очереди JMS, а отдельные серверные машины обрабатывают эти задания. Я заметил, что время, затраченное на метод Job.execute, не более 30 миллисекунд.
Сведения о сервере:
Solaris Sparc 64-разрядный сервер с 8/16 ядрами/потоками cpu для планировщика с ОЗУ 16 ГБ, и у нас есть две такие машины в кластере планировщика.