是否有任何Hangfire作业可以在所有服务器上运行?

时间:2016-02-29 05:36:23

标签: .net asp.net-mvc hangfire

在我的问题中:

1-拥有一个包含大约10台服务器的Web场

2-拥有存储在数据库中的一些全局设置

3-这些设置在控制器中使用率很高(每次请求约10次)

4-如果数据库中的某些设置已更改,则Web场中的所有服务器都应更新其设置。

因此,在每个请求中引用数据库似乎不是一个好的解决方案。 结果我更喜欢:

1-将这些设置存储在static属性

2-在每个服务器中都有一个定期作业,以检查数据库每秒的变化,然后更新这些static属性。

但似乎Hangfire个作业只在一台服务器上运行。有没有办法强制它在所有服务器实例上调用作业?

3 个答案:

答案 0 :(得分:1)

我可以使用以下代码块在所有服务器上运行hangfire定期作业

string jobName = string.Format(" {0} -CacheDepdencyCheck",Environment.MachineName);

                RecurringJob.AddOrUpdate(jobName, () => CacheHelper.ClearExpirationCaches(), String.Format("*/{0} * * * *", frequency));

答案 1 :(得分:1)

我认为它还不支持API级别的此功能。但是你可以通过使用作业队列功能来解决问题。

例如,如果您有10台服务器,则可以使用默认服务器配置一些自定义队列名称,并在服务器启动选项中指定它们,请参阅此link

在您的客户端代码中,您必须手动排队作业:

var queueState = new EnqueuedState("custom_queue_name_*") // * = from 1 to 10

使用hangfire客户端以此队列状态排队作业。

对于10个实例服务器组,使用自定义队列名称将作业排队十次,您将在任何地方运行它们。

确保您的实际执行逻辑可重入。

答案 2 :(得分:0)

正如Hangfire位开发人员提到here之一,此功能目前不适用于Hangfire,他建议使用System.Threading.Timer