Назад | Перейти на главную страницу

Использует ли почта базы данных SQL Server потоки при отправке почты?

Мы используем SQL Server 2008 Почта базы данных для отправки электронных писем посетителям нашего сайта. Я не знаю, отправляет ли SQL Server почту одну за другой, забирая ее из очереди, или он будет использовать потоки для одновременной отправки электронных писем.

Если в Database Mail используются потоки, есть ли способ увеличить количество потоков для одновременного запуска?

Взято из электронной книги: Почта базы данных

Чтобы свести к минимуму влияние на SQL Server, компонент, доставляющий электронную почту, запускается вне SQL Server в отдельном процессе. SQL Server продолжит ставить в очередь сообщения электронной почты, даже если внешний процесс остановится или завершится с ошибкой. Сообщения в очереди будут отправлены, как только внешний процесс или SMTP-сервер подключится к сети.

Database Mail использует технологию Service Broker:

Database Mail обеспечивает фоновую или асинхронную доставку. Когда вы вызываете sp_send_dbmail для отправки сообщения, Database Mail добавляет запрос в очередь Service Broker. Хранимая процедура немедленно возвращается. Компонент внешней электронной почты получает запрос и доставляет электронное письмо.

Фактическая доставка электронной почты осуществляется вашим SMTP-сервером, поэтому он будет нести основную нагрузку и должен быть обеспечен в соответствии с требованиями к емкости / трафику электронной почты.

Видеть Планирование почты для базы данных

SQL Server использует потоки для отправки почты, а ваш почтовый соединитель - нет.

Я бы посоветовал попробовать большой объем писем и посмотреть, насколько хорошо он работает. Я не знаю, отправляется ли почта базы данных последовательно или параллельно - тем не менее, если вам нужно гарантировать хорошо работающую почту, я бы посоветовал вам отправлять почту из клиентского приложения, а не использовать почту базы данных в SQL Server, что, я сомневаюсь, было разработан с этой целью.

Насколько я могу судить, Database Mail не пытается реализовать многопоточность. Он действительно использует Service Broker, поэтому вызов процедуры sp_send_dbmail будет возвращать немедленно, а не ждать отправки сообщения.

Глядя на msdb.sys.service_queues (определения очередей для Service Broker, в котором реализована Database Mail), я вижу очереди с именами InternalMailQueue и ExternalMailQueue, и обе имеют max_readers, равные 1. Просматривая их процедуры активации (sp_ExternalMailQueueListener и sp_sysmail_activate) не предполагает, что там происходит что-то необычное с точки зрения многопоточности. Первый выполняет некоторую обработку ошибок и очистку разговора, а второй выполняет фактическую отправку почты через master..xp_sysmail_activate, что выглядит как блокирующий вызов, который производит код возврата.

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