【问题标题】:Guaranteeing Quartz.NET Triggers only fire events once even with many instances保证 Quartz.NET 触发器即使有很多实例也只触发一次事件
【发布时间】:2012-08-06 21:14:33
【问题描述】:

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

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

【问题讨论】:

    标签: multithreading triggers quartz.net appharbor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      Quartz.NET 似乎有built-in support for clustering。来自文档:

      每次触发时只有一个节点会触发作业。我的意思是,如果作业有一个重复触发器,告诉它每 10 秒触发一次,那么在 12:00:00 恰好一个节点将运行该作业,而在 12:00:10 恰好一个节点将运行作业等。它不一定每次都是同一个节点 - 哪个节点运行它或多或少是随机的。负载平衡机制对于繁忙的调度程序(许多触发器)来说是近乎随机的,但偏向于刚刚对非繁忙(例如一个或两个触发器)调度程序处于活动状态的同一节点。

      【讨论】:

      • 感谢您的帮助,但它不适用于我的存储后端 MongoDB。如果可能,我希望将单独服务器的数量保持在最低限度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多