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

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

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

4 ответа

Взято из Книги Онлайн: База данных Почта

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

База данных Mail использует технологию Service Broker:

База данных 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, который выглядит как блокирующий вызов, генерирующий код возврата.

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

Другие вопросы по тегам