在我的问题中:
1-拥有一个包含大约10台服务器的Web场
2-拥有存储在数据库中的一些全局设置
3-这些设置在控制器中使用率很高(每次请求约10次)
4-如果数据库中的某些设置已更改,则Web场中的所有服务器都应更新其设置。
因此,在每个请求中引用数据库似乎不是一个好的解决方案。 结果我更喜欢:
1-将这些设置存储在static
属性
2-在每个服务器中都有一个定期作业,以检查数据库每秒的变化,然后更新这些static
属性。
但似乎Hangfire
个作业只在一台服务器上运行。有没有办法强制它在所有服务器实例上调用作业?
答案 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