Мы должны отправить автоматические электронные письма. Они должны быть надежно отправлены, поэтому мы записываем их в базу данных. Одновременно System.Threading.Timer
, который был запущен в Application_Start
, вызывает метод каждые 30 секунд для считывания из базы данных и отправки затем удаления записей, которые были отправлены. Ничто из этого не происходит как долговременная задача. Была предпринята попытка убедиться, что процесс очистки db-очереди использует асинхронные методы, поэтому фаза отправки/очереди никогда не блокируется, при этом весь процесс выполняется кратковременными методами в ThreadPool
. Стоимость аппликации приложений также минимальна (возможно, это связано с повторной отправкой одного электронного письма ... не проблема).Неправильно ли запускать мою почтовую очередь в пуле приложений?
Обычная мудрость гласит, что выполнение этого в веб-приложении не так хорошо, и я должен использовать это вместо службы.
Письменные услуги - это PITA. Я бы предпочел избежать этого, если это возможно. Итак, почему я не должен запускать эффективную очередь асинхронной почты в моем пуле приложений? Может ли кто-нибудь просветить меня?
Вы как-то указываете в базе данных, что данное письмо было подобрано и находится в процессе отправки? Если нет, планируете ли вы работать на нескольких веб-серверах? Если ответы на вышеперечисленные вопросы - «Нет» и «Да», то вам потребуется способ предотвратить одновременное отправку одной и той же группы писем одновременно. –
@ChrisShain, я знаю об этом и изменим архитектуру, если сайт будет развиваться до такой степени, что он перерастет свой сервер. – spender
Держите таймер, я сделал аналогичную работу по работе с таймером для своей программы и отлично работал последние 4 года - никаких проблем вообще, я даже делаю идексинг, который занимает 2 дня, работая с одним потоком и таймером. Также читайте: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx – Aristos