【发布时间】:2011-06-06 19:43:06
【问题描述】:
我们在工作中需要一个工作服务器,我目前正在玩 Quartz.net,但创建自己的想法对我很有吸引力。至少了解 Quartz.net 可能在幕后做的事情不会损害我更有效地使用它的理解/机会。
所以我的问题是,如果没有轮询,您将如何在线程上获取和解雇工作?如果您每 2 分钟检查一次“工作商店”以查找需要解雇的工作,您可能会延迟大约 2 分钟。如果您减少轮询时间,则会增加您的工作商店的压力,并且仍然无法获得真正的开始时间。您可以在接下来的两分钟内预加载作业,并让线程在剩余时间内进入睡眠状态,以便它们在适当的时间开始,但如果您的轮询时间很长(删除、重新安排等),这似乎很笨拙并且容易出现问题。我正在剖析 Quartz 以弄清楚它是如何做到的,但我想知道我是否遗漏了一些基本的东西。
编辑:
像 Kevin 最初描述的线程结构似乎是你应该如何做一个工作服务器。它以最少的开销为您提供最大的灵活性。因为线程对于大多数人来说都是一个皮塔(也许只有我 :) 更简单的轮询示例将在 90% 的情况下完成工作,但代价是失去灵活性和更多开销。
另一方面,除非您将其设为单线程并执行单个作业,否则无论如何您都必须处理线程。还不如全力以赴,弄清楚信号。
我也同意 Kevin 的观点,即您在投票数据库示例中声称免费获得的东西并不是真正免费的。如果它是线程/等待应用程序,您将像编写代码一样编写代码。如果您的轮询数据库作业服务器在作业过程中发生故障怎么办?两者都将依赖一些持久的存储来跟踪他们的状态以防发生灾难。
如果您将“jobstore”提升到一个抽象级别并且它不是基于正常的 ACID(正确的术语?)数据库,该怎么办。现在我相信你的很多“免费”东西都不再可用(交易?)。
【问题讨论】:
-
根据我的经验,每秒轮询一次“作业存储”(对我来说是数据库中的一个表)表示我的数据库上的负载非常小。你会得到 1 秒的最大延迟,这似乎是可以容忍的。
-
是的,我感觉它是那些非问题问题之一,但我很好奇,所以我想我会问。
标签: c# .net polling quartz.net job-scheduling