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

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

Например, если у вас 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

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

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.
Сайт использует Cookie. Правила конфиденциальности OK