2012-06-11 2 views
1

Мои знания и опыт в этом ограничены, поэтому не уверен, что я все рассмотрел и был бы признателен за некоторые советы.ASP.NET SMTP отказоустойчивые решения

Текущий сценарий: один сервер Exchange, один сервер базы данных, веб-серверы с балансировкой нагрузки, все электронные письма с отправкой и оповещения на регулярной основе. Этот сервер обмена широко используется в бизнесе, который вызывает высокую нагрузку, которую сервер обмена не может обрабатывать. В какой-то момент сервер опустился на длительный период времени, что привело к тому, что электронные письма не достигли места назначения и не регистрировали попытки электронной почты, чтобы определить, какие электронные письма не удались, чтобы их можно было вручную отправить позже. Кроме того, веб-сайт ожидает ответа SMTP, поэтому существует задержка загрузки веб-страницы.

План: второй SMTP-сервер должен быть представлен для снижения нагрузки на исходный сервер, а также для внесения некоторых улучшений на веб-сайт, чтобы уменьшить его зависание ресурсов и улучшить протоколирование всех попыток электронной почты (только информация заголовка), с Статус ответа SMTP.

Возможные решения:

  1. Изменить метод электронной почты на веб-сайте, чтобы войти, а затем пытаются SMTP через один или другой сервер, записать ответ SMTP. Плюсы: быстрее разрабатывать, минусы: нет асинхронной обработки очереди электронной почты.

  2. Записывать заголовки электронной почты, а затем использовать MSMQ или RabbitMQ для отправки запроса электронной почты в очередь и иметь службу прослушивателя, которая обрабатывает процесс фактической отправки электронной почты на сервер Exchange. Кроме того, если он продолжает не доходить до серверов SMTP, оставьте его в очереди и повторите попытку позже. Плюсы: Можно повторно использовать инфраструктуру и опыт использования MQ в будущих функциональных требованиях, таких как пользовательские запросы для загрузки данных, a la Facebook. Минусы: время, чтобы узнать, как это сделать, и на самом деле развиваться, когда сталкиваются с крайним сроком.

  3. Отправляйте сообщение электронной почты на адрес db, затем отправьте его в локальную папку для отправки, которая будет передаваться на сервер Exchange, но я думаю, что у нее нет поддержки отказа или метод обновления статуса в журнале электронной почты, поэтому, как я вижу, на самом деле не соответствует всем требованиям.

Что я искушению сделать, это сделать, это развивается в два этапа, сначала только первый раствор затем развивать функциональность/RabbitMQ MSMQ, чтобы сделать его асинхронным на более поздний срок, но думал, я бы спросить мнения, чтобы посмотреть, не замечу ли я что-то.

+0

Есть ли требование использовать биржу для ** ** все по электронной почте? Если нет, вы можете/должны искать внешние службы, которые могут стоять в очереди и выполнять переход на другой ресурс для ваших нужд обмена сообщениями. Я могу представить, как загружаются ваши серверы, если они делают «все» (спам/анти-х/и т. Д.). Если возможно, подумайте об аутсорсинге, который вы можете ..... – EdSF

+0

Это было бы хорошим решением, но, к сожалению, это для клиента, и они хранят свои электронные письма на собственном сервере, а не на аутсорсинге. –

+0

Как узнать, какие электронные письма могут использовать только SMTP-сервер IIS и Exchange? электронные письма веб-сайтов, транзакционные письма и т. д. - каждый из ваших веб-серверов может потенциально находиться в пуле SMTP-серверов. Я все еще думаю о том, что ** должно ** использовать Exchange и некоторые другие MTA .... – EdSF

ответ

0

Возможно, вы захотите взглянуть на NServiceBus.

В частности, есть некоторые новые функции электронной почты. Был создан спутник, который дает вам преимущества повторных попыток, которые поставляются с NServiceBus, чтобы сделать вашу электронную почту более надежной.

Вы получаете отдельную очередь, не требуя новой конечной точки или конфигурируя любые сопоставления сообщений. Таким образом, у каждой конечной точки встроена эта возможность, и единственной необходимой конфигурацией является раздел конфигурации SmtpClient.

API для этой функции: Bus.SendEmail(new MailMessage). Они используют System.Net.Mail.MailMessage как абстракцию для отправки электронных писем.

Код в настоящее время находится в их develop branch. Образец, демонстрирующий все это, можно найти here.

Для получения дополнительной информации см here

Смежные вопросы