标题有点古怪,但我正在尝试为 AppHarbor 找出一个解决方法,可能会触发我的后台应用程序的多个实例。此应用程序使用 Quartz.NET 按基本计划将关键事件推送到我的服务器。但是,我不能保证我的后台应用程序只有一个实例,但我必须让每个事件正常触发(基本上作为服务器 POV 的一个单元)。
我最初尝试使用锁定和 Redis 来解决这个问题,但我无法让它工作得足够好。有没有办法做到这一点?
标题有点古怪,但我正在尝试为 AppHarbor 找出一个解决方法,可能会触发我的后台应用程序的多个实例。此应用程序使用 Quartz.NET 按基本计划将关键事件推送到我的服务器。但是,我不能保证我的后台应用程序只有一个实例,但我必须让每个事件正常触发(基本上作为服务器 POV 的一个单元)。
我最初尝试使用锁定和 Redis 来解决这个问题,但我无法让它工作得足够好。有没有办法做到这一点?
您可以通过在每次运行后重新安排自己的工作来做到这一点。您无需指定计划是什么,但如果不必同时发生,则使用仅触发一次的触发器来计划作业。当作业完成运行后,让它在未来的某个时间再次安排自己。这样,在任何给定时间,商店里只有一份工作。您可能必须在如何加载初始作业和处理错误方面发挥创造力,但只要您在引导时只能安排一项作业,那么您就有可能让它工作。
Quartz.NET 似乎内置了对集群的支持。从文档中:
每次触发时只有一个节点会触发作业。我的意思是,如果作业有一个重复触发器,告诉它每 10 秒触发一次,那么在 12:00:00 恰好一个节点将运行该作业,而在 12:00:10 恰好一个节点将运行作业等。它不一定每次都是同一个节点 - 哪个节点运行它或多或少是随机的。对于繁忙的调度程序(许多触发器),负载平衡机制是近乎随机的,但对于非繁忙(例如,一个或两个触发器)调度程序,它有利于刚刚处于活动状态的同一节点。