У меня есть сервис.NET, который обрабатывает очередь на фоновом потоке, и от объектов в очереди отсылает большое количество маленьких электронных писем на очень высоком показателе (скажите, что 100 сообщений в секунду, если это даже возможно). В настоящее время я использую SmtpClient.Send()
но я боюсь, что это может препятствовать производительности.
Каждый вызов к Send()
проходит полный цикл открытия сокета, выполнения разговора SMTP (HELO, ПОЧТА ОТ, ПРИЕМ К, ДАННЫЕ) и закрытие сокета. В псевдо коде:
for each message {
open socket
send HELO
send MAIL FROM
send RCPT TO
send DATA
send QUIT
close socket
}
(Редактирование: Этот оператор о SmtpClient.Send()
на самом деле ложь, как я объяснил в своем ответе.)
Я думал бы, что следующий псевдо код будет более оптимальным:
open socket
send HELO
for each message {
send MAIL FROM
send RCPT TO
send DATA
}
send QUIT
close socket
Если я обеспокоен производительностью SmtpClient.Send()
при посылании электронного письма на высокий показатель? Каковы мои опции для оптимизации производительности?
Класс SmtpClient
незаметно кэширует подключения к серверу SMTP. Повторный вызов SmtpClient.Send ()
для отправки нескольких сообщений на один и тот же SMTP-сервер будет эффективно выполнять псевдокод во втором примере.
Одним из способов повышения производительности может быть использование нескольких экземпляров SmtpClient
, работающих в нескольких потоках. Вместо одного подключения к SMTP-серверу у службы теперь будет много одновременных подключений. Входящие сообщения электронной почты берутся из очереди и отправляются в пул рабочих потоков, который вызывает SmtpClient.Send ()
для отправки сообщения на SMTP-сервер.
Я провел несколько элементарных тестов и обнаружил, что это может улучшить производительность на 100%. Однако оптимальное количество одновременных подключений и фактическое улучшение производительности, вероятно, во многом зависят от SMTP-сервера. Один из способов расширить эту идею - подключиться к нескольким SMTP-серверам.
Создайте сервер электронной почты, который асинхронно отправляет электронные письма с использованием пула потоков или чего-то еще. Таким образом, вы можете «запустить и забыть» свои электронные письма на сервере и позволить ему беспокоиться об их отправке. Настройте его с помощью нескольких потоков или больше, и он сможет довольно быстро просматривать электронные письма.
Указан процесс отправки электронной почты с использованием SMTP (изначально) в RFC 821 . С тех пор было много обновлений и дополнений, но основной протокол остался прежним. Вам нужно начинать каждую транзакцию с помощью команды HELO, а затем добавлять информацию об отправителе, получателях и т. Д. Если вы отправляете одно и то же сообщение всем получателям, вы можете добавить несколько получателей в одно сообщение. Однако, если текст сообщения отличается для каждого получателя, я думаю, вам нужно будет отправлять отдельные сообщения каждому из них, что означает отдельную транзакцию для каждого.