Статьи  : 

Влияние отправки писем на загрузку страницы

25 января 2014, 19:03

В данной статье мы рассмотрим кейс из нашей практики, связанный с отправкой писем из скриптов.

Постановка задачи



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

Однако здесь есть слабое место – время отправки письма почтовой системой. Что, если она или даже просто сам сервер будут значительно загружены? В этом случае посетитель нажмет кнопку действия, и будет долго и мучительно ждать, когда же ему отобразится хоть что-нибудь. Разумеется, такой вариант неприемлем. Более того, проблема может проявляться эпизодически (то есть, то нет), что сильно затруднит ее диагностику и исправление.


Практическая часть



Описанная выше проблема с отправкой писем как раз и возникла у одного из заказчиков. Условно в его системе были "клиент" (взаимодействующий с пользователями) и "сервер". Клиент делает запрос на сервер, тот отправляет нужное письмо из списка. По утверждению заказчика, сервер достаточно мощный, но почему-то скрипт на клиенте стал изредка отпадывать по тайм-ауту (5 секунд). Для поиска источника проблемы в серверный скрипт был добавлен мониторинг времени отправки, который обнаружил следующую картину (время в секундах):

0.827543
0.219780
5.823765
5.779211
6.545830
0.872161
3.775731
0.683852
.... 
0.123576
7.767703
0.316762
6.032296
0.426179
0.112147
.... 
0.116253
15.270721
15.338176
0.418619
0.709937
0.161958
1.598909


Как видно, время отправки писем прыгает непредсказуемо. Причем, причина была где-то именно в почте, так как при отключении отправки писем всё работало стабильно.

Для решения задачи в систему была добавлена так называемая "почтовая очередь", куда складывались необходимые уведомления. Далее они разбирались уже отдельным скриптом, который работал в фоновом режиме и никому не мешал.

Вывод: отправка писем "на лету" из скрипта, конечно, допустима, но лучше отделять этот процесс (интерфейс отдельно, почта – отдельно). Иначе возможны ситуации, когда система будет долго (и, как кажется посетителю, необоснованно) "висеть" именно на отправке, а такие вещи никому не нравятся.