【问题标题】:Increase the recurring job polling interval for hangfire and enabling/disabling the recurring job process增加hangfire的重复作业轮询间隔并启用/禁用重复作业流程
【发布时间】:2016-12-30 17:58:04
【问题描述】:

我正在尝试使用 hangfire 创建后台处理器 Windows 服务。 我想将循环作业轮询间隔增加到 1 分钟以上(默认为硬编码)。这样做的原因是重复轮询会影响数据库的性能。
是否有可能启用/禁用 hangfire 重复作业功能。如果安装了多个服务实例,则需要这样做。

【问题讨论】:

    标签: asp.net-mvc windows-services hangfire


    【解决方案1】:

    当您在 Hangfire 中创建循环作业时,即使您有多个 Hangfire 服务器,该作业也不会同时在两台服务器上运行。

    您可以使用 Cron 表达式来定义运行作业的频率,如 Hangfire docs 中所述:

    RecurringJob.AddOrUpdate(() => YourJob(), "0 12 * */2");
    

    但是,您可能需要避免在前一个实例仍在运行时触发作业。对于这种情况,我建议您在工作开始时设置一个标志(例如在数据库中),并在工作结束时将其删除。然后在实际开始进程之前检查标志是否存在。

    更新

    正如您所说,您希望阻止 RecurringJobScheduler 在某些服务器上运行,我已经查看了代码,似乎没有这样做的选项。

    您可以查看文件BackgroundJobServer.cs,其中将调度程序添加到进程列表中,以及查询数据库的RecurringJobScheduler.cs。 1 分钟的值是硬编码的,在 cmets 中指定。

    我认为您唯一的选择是您已经提出的拉取请求:(

    【讨论】:

    • 我在这里想说的是多个服务实例轮询数据库以获取重复作业是数据库的性能损失。我想知道hangfire是否支持一项功能,在该功能中我可以禁用循环作业调度程序轮询选定的服务实例。在我的情况下,循环作业的并发执行不是问题。希望这有助于进一步解释问题
    • 高度赞赏上述问题的任何解决方案
    • @PratikPushpendra 您是否评估过您所指的性能影响?感觉你不会有很多收获
    • 考虑一个场景,我有 4 个运行 hangfire 服务器的 Windows 服务实例。在当前情况下,所有 4 个都将轮询数据库以获取重复作业。就我而言,数据库是一个高度事务性的数据库。因此,由于每分钟有 4 个额外的请求,数据库的性能参数会受到影响。我宁愿为选定的实例禁用重复作业轮询功能,或者至少增加轮询间隔。我在 git hub 上创建了一个拉取请求,并进行了相同的更改 -github.com/HangfireIO/Hangfire/pull/776
    猜你喜欢
    • 2021-01-28
    • 2018-02-23
    • 2019-01-08
    • 2015-08-27
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多