2016-09-26 16 views
1

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

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

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

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

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

Любые мысли будут оценены. Благодаря!

ответ

1

Нет проблем с наличием нескольких серверов «задачи», работающих под управлением Hangfire. Он предназначен для этого.

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

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

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

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

Whoa! Это кажется легким. Я попробую и дам вам знать. Спасибо, Саймон! – tuchi35

+1

Это сработало! Большое спасибо! – tuchi35