Asp.net 通过Web服务实现Quartz.Net负载平衡

Asp.net 通过Web服务实现Quartz.Net负载平衡,asp.net,cluster-computing,quartz.net,Asp.net,Cluster Computing,Quartz.net,我是Quartz.NET的新手,请在这里耐心等待 我使用Quartz作为在服务器集群上运行的网站的一部分。为了促进作业的负载平衡,它们通过负载平衡器调用web服务(在同一网站上运行),以确保在web服务器上以最小负载执行作业。其中一些工作可能需要几个小时才能完成。问题是Quartz作业和web服务可能在不同的机器上运行。如果运行Quartz作业的计算机在等待web服务在另一台计算机上完成时崩溃,则Quartz将不知道任务是否已顺利完成。我可以异步调用web服务,但Quartz只会认为无论web服

我是Quartz.NET的新手,请在这里耐心等待

我使用Quartz作为在服务器集群上运行的网站的一部分。为了促进作业的负载平衡,它们通过负载平衡器调用web服务(在同一网站上运行),以确保在web服务器上以最小负载执行作业。其中一些工作可能需要几个小时才能完成。问题是Quartz作业和web服务可能在不同的机器上运行。如果运行Quartz作业的计算机在等待web服务在另一台计算机上完成时崩溃,则Quartz将不知道任务是否已顺利完成。我可以异步调用web服务,但Quartz只会认为无论web服务中发生了什么,作业都会立即成功完成。这不允许我确保同一个作业不会同时运行,因为Quartz会认为它已完成。它也不允许在失败时重试,也不允许我查看当前正在运行的作业

石英中有我忽略的特征吗?还有其他人必须处理类似的情况吗?有没有更好的方法来平衡工作负载

现在,我认为我需要修改Quartz JobRunShell类,以不设置作业和触发器的完整状态(不确定这是否是正确的位置?)。然后允许我的web服务在完成时设置状态。我还需要添加代码来处理web服务崩溃和作业永远无法完成的情况。为此,我计划在web服务上创建一个线程,定期告诉Quartz作业仍在运行(通过我将添加到数据库中的新时间戳字段)。我必须定期检查正在运行的作业,看看它们是否仍在运行(通过新字段),如果它们在一段时间内没有更新(比如更新周期的5倍),那么我将假设作业已失败,并将作业设置为失败,然后重试(如果适用)

如有任何帮助/意见,将不胜感激

编辑:我正在使用Quartz.Net 2.3版,Quartz功能本身执行负载平衡。如果你使用它,你可以完全避免你的工作调用Web服务。相反,您将配置作业以直接运行所需的代码,quartz负载平衡将根据负载选择运行作业的机器。尽管quartz.net支持,但只有在quartz文档的java版本中,您才能找到关于如何在


要使集群工作,您应该设置
quartz.jobStore.clustered=true
属性,以及您使用的是哪个jobStore?有多少应用程序调用web服务?@CircularReference使用JobStoreTX。web服务是专门为Quartz创建的,所以只有一个应用程序。@Graham您找到这个问题的答案了吗?文章中说“负载平衡会自动发生,群集的每个节点都会尽快启动作业。”对我来说,这听起来不像是正确的负载平衡,因为它只是希望最低的负载实例能够完成任务,但事实并非如此。要做到这一点,Quartz是否需要检查服务器资源利用率?我想这就是web负载平衡器的工作原理。我不知道quartz到底是如何工作的,但我想我同意你的看法。在我的例子中,配置quartz群集的简单性,而不需要自己实现功能,并且有像您这样的顾虑,以及暗示可维护性的额外复杂性,使我很容易选择它。如果您认为您的案例不能通过quartz集群得到正确解决,请务必不要使用它。我想尝试一下,毕竟它是为这个目的而构建的Quartz功能。我稍微研究了一下网络负载平衡,结果发现它甚至只分配请求的数量,而不考虑实际的服务器负载。这正是石英已经在做的事情。我将不得不进一步研究Quartz的源代码,并进行一些负载测试,看看它的工作情况如何。谢谢@Marios。