Как отследить и ограничить большое количество однородных запросов на сайте

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

Например, если у вас 50 строк в таблице, и вы положили в каждую строку по 2 сниппета формы, то это приведет к 2 * 50 дополнительным запросам, которые создадут ненужную нагрузку на сервер. И это только от одного пользователя. А если он открыл 5-10 подобных страниц сразу? А если несколько пользователей сделают одновременно подобные действия? В итоге получается, что при небольшой посещаемости создается значительная нагрузка по запросам к серверу и БД.

Как этого избежать - очень просто, использовать as-form-modal, as-form-link, sub_ и modal_ поля строки таблицы. Таким образом загрузка конкретной формы будет идти только по клику пользователя. Т.е. средства как правильно сделать есть, но никто не застрахован от ошибок, а нужен инструмент выявления и правильной обработки подобных ситуаций. 

В этой статье мы рассмотрим механизм как защититься от таких "невзгод".

Для этого в системе предусмотрены специальные настройки в as.systemOptions: 

{ "disableDebugMode": false, // возможность отключить показ отладочных сообщений в консоли браузера
    "doubleRequests.disableCheck": false, // отключить контроль количества одинаковых запросов на странице
    "doubleRequests.count": 3, // порог по количеству запросов, после которого будет идти уведомление в trace с кодом dblreq
    "doubleRequests.countLimit": 4, // после превышения данного порога запрос будет отбрасываться и выводиться сообщение юзеру
    "doubleRequests.duration": 2000, // длительность в течение которого учитывается количество запросов (в миллисекундах)
}

В случае наступления 1 порога (count), мы просто фиксируем это в trace. В случае наступления 2 порога - блокируем запросы и выводим на странице сообщение.  Это предотвратит чрезмерную загрузку сервера. 

В профилактике проекта можно добавить такой запрос для выявления этих ситуаций: 

-- show too many dublicate requests per page
select top 200 itemID reqCount,
    dbo.as_stripHTML(replace(text, '
', char(10))) text,
	convert(nvarchar(20), created, 120) + iif(len(username)>0,  ' - ' +  username, '') details
	from as_trace where code='dblreq' order by id desc

 Таким образом, периодически, смотря в профилактику, можно обнаружить подобные ситуации.

Страница-источник на сайте falconspace.ru