Использование Hangfire для ежедневной отправки электронных писем в распределенной среде

Я новичок в Hangfire и хочу знать, можно ли этого достичь с помощью инструмента:

Я должен ежедневно отправлять электронные письма списку людей, которые есть в моей базе данных SQL. Дело в том, что мое веб-приложение (хотя оно использует только одну БД) развертывается через Amazon с балансировщиками нагрузки, которые могут добавлять серверы (при необходимости).

Я хочу, чтобы задача Hangfire выполнялась только один раз в день.

Моя первая идея заключалась в том, чтобы использовать Hangfire для регистрации повторяющейся задачи в моем методе Application_Start, но это не сработает, верно? Как я могу зарегистрировать мою повторяющуюся задачу таким образом, чтобы, даже когда у меня запущено несколько серверов, задача выполнялась только один раз? Я читал в других сообщениях, что могу проделать некоторые трюки с БД: наличие «таблицы», которая регистрирует, если задача уже выполнена или нет, но я думаю, что такое решение не будет масштабироваться, если мне нужно, скажем , 10 задач в день.

Другой способ, которым я думаю, - это иметь отдельное «приложение» для выполнения зависания, которое будет разворачиваться только на одном сервере. Поскольку мое веб-приложение использует dll для доступа к базе данных, я мог бы сделать то же самое для этого нового «приложения» и предоставить доступ к базе данных с той же dll, но мне придется обновлять свое приложение каждый раз, когда я изменяю dll.

Любые мысли будут оценены. Спасибо!


person Christian Martinez    schedule 26.09.2016    source источник


Ответы (1)


Нет проблем с наличием нескольких серверов "задач", на которых работает Hangfire. Он предназначен для этого.

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

Ознакомьтесь с объектом Cron для получения дополнительных опций. Просто убедитесь, что вы используете тот же идентификатор для YourEmailJobID, и он будет работать так, как вы планировали. Вы можете вызвать этот метод сотни раз с сотен разных серверов, и пока вы передадите одни и те же параметры, запись задания в базе данных Hangfire не изменится.

Кроме того, если у вас есть одновременно выполняющиеся задания, но вы хотите, чтобы только один из ваших серверов задач выполнял задание одновременно, используйте этот атрибут в своем методе Hangfire.

    [Hangfire.DisableConcurrentExecution(60)]
    public void YourMethodCall(object anyParameter)
    {
         ....
    }
person Simon Ordo    schedule 26.09.2016
comment
Ого! Кажется, это просто. Я попробую и дам вам знать. Спасибо, Саймон! - person Christian Martinez; 26.09.2016