Sql server 具有AdoNetJobStore性能的Quartz.NET

Sql server 具有AdoNetJobStore性能的Quartz.NET,sql-server,performance,quartz.net,Sql Server,Performance,Quartz.net,我有约500万个作业,每个作业在Quartz.Net中都有一个触发器。由于计划同时运行的作业最多为约30万个,我必须在3小时内完成所有30万个作业(约10万个作业/小时),但现在当Quartz.Net配置为使用AdoNetJobStore时,我的测试应用程序只能每小时运行10公里 我正在使用下一个石英配置: <quartz> <add key="quartz.scheduler.instanceName" value="XxxDefaultQuartzScheduler

我有约500万个作业,每个作业在Quartz.Net中都有一个触发器。由于计划同时运行的作业最多为约30万个,我必须在3小时内完成所有30万个作业(约10万个作业/小时),但现在当Quartz.Net配置为使用AdoNetJobStore时,我的测试应用程序只能每小时运行10公里

我正在使用下一个石英配置:

<quartz>
    <add key="quartz.scheduler.instanceName" value="XxxDefaultQuartzScheduler" />
    <add key="quartz.scheduler.instanceId" value="instance_one" />
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="1" />
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.dataSource" value="default" />
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
    <add key="quartz.jobStore.useProperties" value="false" />
    <add key="quartz.dataSource.default.connectionStringName" value="QuartzDbContext" />
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" />
</quartz>


是否可以将Quartz.Net配置为SQL作业存储以提供这样的性能?

对于这种大规模使用,默认线程数10非常低。我会把它增加到,比如说,计算机的25倍核。当然,您也可以测试更高的值。现代硬件应该能够处理100-200个线程,但线程争用可能会成为一个问题

您没有提到您正在使用的版本,但是对于较新的版本,您可以删除quartz.jobStore.lockHandler.type,当它检测到使用了SQL Server时,将使用优化的行锁定。始终使用最新版本(如果可能),最新版本往往是最优化和无bug的

调整石英配置后,您自然必须分析自己的工作代码。假设您的代码能够在5秒钟内完成,那么我们大概会有:

5秒*300000个触发器/100个线程=>15000秒~250分钟~4小时

将5秒的执行时间降低到3秒,你将达到2小时30米的目标。或者只是增加线程数量并为资源之战做好准备——这取决于您的工作正在做什么以及如何做


另一个考虑因素可能是集群,如果石英数据库不是瓶颈,则针对石英数据库运行多个worker。

对不起,配置文件有下一个连接字符串:石英在尝试选择作业时会在其数据库表上引起相当多的争用。如果作业非常快,并且您使用许多线程来尝试拾取作业,则情况会变得更糟-这会导致许多线程频繁尝试访问Quartz表以进行锁定。您需要安排这些作业还是需要对它们进行排队?如果您需要队列(与计划作业相反),最好不要使用Quartz。任务是在特定时间继续执行所有任务(由于作业太多,我可能有3个小时的时间来完成它们)。我考虑使用一个此时开始的作业,用作业信息查询我的自定义表并处理它们,但后来我发现我正在实现Quartz功能:失火策略、计划、触发器和崩溃恢复。