Quartz和pooling与系统计时器的性能比较

时间:2016-03-24 20:16:43

标签: .net timer windows-services quartz-scheduler scheduler

我们正在接近一个非常普遍的问题(我们至少假设),但令人惊讶的是找不到很多选择。对于业务应用程序,我们有一个ASP.NET MVC应用程序作为前端UI门户,配备了几个MSMQ / Windows服务来执行繁重的任务,例如,与外部会计系统同步。

我们希望引入一项新服务来运行基于时间的任务。例如,对于系统中的采购订单,它具有预期的货物交付时间。在此之前六个小时,服务需要检查我们是否收到货物并作出相应的反应。

我们有两种方法:

方法1:静态定义作业并根据特定时间间隔运行它们。在MEF框架的帮助下,可以在运行时添加/删除作业。

方法2:通过MSMQ将Quartz.Net作为Windows服务和订阅源任务运行。

我们对这两种方法有一些想法。专家和骗子:

  • 效率:

使用方法1:在上面提到的示例中,这意味着我们需要查找所有采购订单并进行全部检查。使用方法2时,在一个特定时间只为一个采购订单安排一个作业。

  • 精度:

方法1难以确保准确性,缺少的余量取决于作业运行的时间间隔

  • 灵活的时间表:

方法2可以提供非常灵活的时间表,因为它支持类似Cron的触发器

  • 表现:(这是我们的主要不确定因素)

我们对Quartz关于其可能带来的性能/压力感到担忧,因为理论上我们可以将数万个作业投入调度程序。

不清楚Quartz的实现,我们知道,对于繁重的职责,不断创建计时器并不理想(如果不是不可接受的话)。

Q1:那么Quartz如何管理大量的工作并准确地解决它们而不会由计时器引起过多的开销?

第二季度:任何人都可以了解引擎盖下的魔力吗?或者当工作开始堆积时Quartz会降级吗?

问题3:对于我们的需求,还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:0)

第三种选择是维护即将运行的作业的数据库。数据库中的每条记录都包含到期时的日期时间,类型和一些id。一个(或多个)工作者轮询数据库并抓取(原子地)下一个到期(或过期)项,加载适当的工作类(基于类型)并使用id调用它。

每个工作人员任务可以排队其他未来的工作项,如果无法运行,可以重新安排自己,如果不再有任何工作要做,可以简单地离开(可能原始采购订单已被删除),...

优点:

  1. 您可以监控等待完成/正在运行/失败的工作
  2. 您可以重试失败的工作(已开始但未完成的工作)
  3. 您可以轻松扩展工作人员(更多线程或处理器)
  4. 易于配置(只是另一张表)

答案 1 :(得分:0)

还有一个名为Hangfire服务的选项,您可以使用Cron选项卡表达式创建Windows服务并计划。