Quartz 调度程序性能调整/开销

问题描述 投票:0回答:1

我是 Quartz Scheduler 框架的新手。我们使用quartz 2.3.2 来调度作业。我有大约一百万个预定的工作,这些工作有不同的频率。但大多数情况下,我每分钟都会触发 6000-7000 次。这些工作在计算方面非常轻,它们只是通过兔子发布消息。我正在使用 postgres 数据库来保存这些作业。我有一组调度程序服务实例来处理规模。

我将所有计划作为 crontriggers,并将失火策略设置为“MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY”。

石英配置:

 spring:
  application:
    name: my-scheduler-service
  quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: never # Let Flyway handle initialization
    properties.org.quartz:
      scheduler:
        batchTriggerAcquisitionMaxCount: 600
        instanceName: JobScheduler
        instanceId: AUTO
      threadPool:
        class: org.quartz.simpl.SimpleThreadPool
        threadCount: 600 # Todo: determine appropriate size here
        threadPriority: 5
      jobStore:
        maxMisfiresToHandleAtATime: 400
        acquireTriggersWithinLock: true
        isClustered: true
        driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
  resources:
    global:
      enabled: true
      url:
      hikari:
        poolName: GlobalDBPool
        minimumIdle: 20
        maximumPoolSize: 50

问题

  1. 我们在 Kubernetes 上部署了该服务,有 4 个 Pod。不幸的是,我们发现任务执行存在巨大的延迟。导致大量失火。我们无法赶上这种失误,现场工作也没有被触发。
  2. 我们还观察到石英锁定需要时间(70-74 秒)。这主要用于“SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME = ? AND LOCK_NAME = $1 FOR UPDATE”查询。

我可以做哪些事情来提高石英性能?

java spring performance scheduled-tasks quartz-scheduler
1个回答
0
投票

这些任务是同时执行的吗?如果是并发执行,每个任务执行都需要与数据库建立连接,根据你的描述,“但大多数情况下我每分钟都会触发6000-7000个触发器”,我建议增加数据库连接池中配置的连接数。

© www.soinside.com 2019 - 2024. All rights reserved.