在分布式环境下使用hangfire日常发送邮件

Using hangfire to send emails on a daily basis in a distributed environment

我是 Hangfire 的新手,我想知道这个工具是否可以实现:

我必须每天向 SQL 数据库中的人员列表发送电子邮件。问题是我的网络应用程序(尽管它只使用一个数据库)是通过亚马逊部署的,负载均衡器可能会添加服务器(如果需要)。

我希望 hangfire 任务每天只执行一次。

我的第一个想法是使用 Hangfire 在我的 Application_Start 方法上注册循环任务,但这行不通,对吗? 如何以一种方式注册我的经常性任务,即使我有多个服务器 运行,任务也只执行一次?我在其他帖子中读到我可以对数据库做一些技巧:有一个 "table" 来注册任务是否已经执行,但我认为如果我必须有,这种解决方案将无法扩展,比方说,每天要完成 10 个任务。

我想的另一种方法是有一个单独的 "app" 用于 hangfire 执行,它只部署在一个服务器中。由于我的 Web 应用程序使用 dll 来访问数据库,我可以对这个新的 "app" 执行相同的操作并使用相同的 dll 授予对数据库的访问权限,但每次我都必须更新我的应用程序更改dll。

如有任何想法,我们将不胜感激。谢谢!

拥有多个 "task" 服务器 运行 Hangfire 没有问题。它就是为此而设计的。

Hangfire.RecurringJob.AddOrUpdate<YourJobClass>(YourEmailJobID, x => x.YourMethodCall(anyParameter), Cron.Daily);

查看 Cron 对象以获得更多选项。只需确保您对 YourEmailJobID 使用相同的 ID,它将按您的预期工作。您可以从一百个不同的服务器调用该方法一百次,只要您传递相同的参数,Hangfire DB 中的作业条目就不会改变。

此外,如果您有并发作业 运行,但只希望其中一台任务服务器同时执行该作业,请在 Hangfire 方法上使用此属性。

    [Hangfire.DisableConcurrentExecution(60)]
    public void YourMethodCall(object anyParameter)
    {
         ....
    }