如何使单应用支持十万以上的定时任务

更新时间:

在SchedulerX中创建的应用默认最多只支持1,000个任务,而在某些场景下1,000个任务远远满足不了业务需求。另外,实际业务场景中,不同定时任务的调度时间可能不一样。本文介绍如何通过一系列配置,使单应用能够支持上万,甚至十万以上的定时任务,并且不同任务能够有独立的调度时间。

应用场景

常见应用场景是每个定时任务调度时间都不一样,无法通过MapReduce分布式任务解决(MapReduce分布式任务每个子任务调度时间是一致的)。

  • 物联网智能开关

    智能开关可以设置定时开启、关闭,是由用户自定义设置的,所以每个开关的定时时间是不一致的。可以给每一个开关设置一个定时单机任务。在物联网场景下,定时单机任务可能会达到万、甚至十万级别。

  • 业务监控

    业务监控需要配置监控报警规则,一般每分钟轮询一次,符合规则则报警。大部分场景下使用一个MapReduce分布式任务是可以解决的,但是如果由于报警规则的复杂程度不同而导致执行时间差异较大时,有可能出现一个报警子任务没有执行完而阻塞整个任务下次调度。所以,可以给每个报警规则配置一个定时单机任务。当业务规模很大时,定时单机任务也可能达到万、甚至十万级别。

  • 将SchedulerX作为底座

    当将SchedulerX作为底座,封装一层任务调度平台(通过POP API新建任务)提供给自己的公司使用时,任务量也有可能达到万、甚至十万级别。

操作步骤

使单应用能够支持十万以上的定时任务,需要完成以下两个步骤:

  1. 联系SchedulerX技术支持人员,开启应用自动扩容。

    开启应用自动扩容后,单应用的任务数达到上限(1000)后,会自动感知并分裂出一个新的子应用。

  2. 使用1.2.1及以上版本客户端接入SchedulerX,并开启共享ContainerPool功能。

    本文以Spring Boot应用为例进行介绍,客户端接入详情请参见Spring Boot应用接入SchedulerX。如果您使用其它类型的应用接入,请参见快速入门 > 客户端快速接入中的相关文档。

    1. 在应用的pom.xml文件中添加1.2.1及以上版本的客户端依赖。

      1.2.1以下版本客户端不支持共享ContainerPool,所以请在应用中添加1.2.1及以上版本客户端,或将客户端的依赖升级到1.2.1及以上版本。更多客户端版本信息请参见客户端发布记录

    2. 在应用的配置文件中添加共享ContainerPool配置。

      spring.schedulerx2.shareContainerPool=true #开启所有任务共享线程池
      spring.schedulerx2.sharePoolSize=128   #自定义共享线程池大小
      说明

      如果未开启共享ContainerPool,每个任务触发都会新建一个线程池,客户端负载会因超负荷而发生异常。