保证 Quartz.NET 触发器仅触发一次事件,即使具有许多实例也是如此



标题有点古怪,但我正在尝试找出 AppHarbor 可能触发我的后台应用程序的多个实例的解决方法。此应用程序使用 Quartz.NET 按基本计划将关键事件推送到我的服务器。但是,我不能保证我的后台应用程序只有一个实例,但我必须正常触发每个事件(基本上充当服务器 POV 中的一个单元)。

我最初试图使用锁定和 Redis 来解决这个问题,但我无法让它工作得足够好。有什么办法可以做到这一点吗?

您可以通过在每次运行后重新安排作业来做到这一点。您没有指定计划是什么,但如果它不必同时发生,则使用仅触发一次的触发器计划作业。作业完成运行后,让它在将来的某个时间再次计划自己。这样,在任何给定时间,商店中都只有一个作业。您可能需要创造性地加载初始作业和处理错误,但只要您可以在引导时只安排一个作业,那么您就可以让它工作。

Quartz.NET 似乎内置了对集群的支持。从文档中:

每次触发时,只有一个节点将触发作业。我的意思是,如果作业有一个重复触发器,告诉它每 10 秒触发一次,那么在 12:00:00 正好有一个节点将运行作业,而在 12:00:10 只有一个节点将运行作业,依此类推。它不一定每次都是同一个节点 - 运行它的节点或多或少是随机的。对于繁忙的调度程序(大量触发器),负载平衡机制几乎是随机的,但对于非繁忙(例如一个或两个触发器)调度程序,负载均衡机制倾向于刚刚处于活动状态的同一节点。

最新更新