Задать вопрос
NikFaraday
@NikFaraday
Student full-stack Developer

Как ограничить количество запросов на сервер при создании поисковика?

Проект на asp.net core mvc. Есть поисковая строка. При изменении текста я поле ввода делается запрос на сервер, откуда вытягивается json с результатами поиска. Для поисковой строки использую плагин которые и нормально работает с этими json, что упрощает работу, но хотел уточнить, что это не рукописная система поиска.

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

Как решение хочу ограничить число запросов на эндпоинт в секунду. Видел, есть какой-то AspNetCoreRateLimiter, но немного не понял по документации для чего он вообще используется и стоит ли конкретно его использовать для решения проблемы

Возможно, есть и другие варианты решения проблемы, с радостью рассмотрю их
  • Вопрос задан
  • 189 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@mvv-rus
Настоящий админ AD и ненастоящий программист
Не то, чтобы ответ, но идея ответа. И если чо непонятно - могу в каментах поуточнять.
Со стороны тыла (на C#) можно ограничить число параллельных запросов в целом к сервису безо всяких там плагинов, а саморучно сделанным велосипедом: семафором (например, SemaphoreSlim, как самым модным в этом сезоне). Либо сделать его статическим, либо (чтобы веру в IoC свято блюсти и модульные тесты делать) - запихнув в Singleton-сервис с теми же свойствами/методами, что и у семафора используются, и получать этот сервис через конструктор (передавать через DI - в бою, напрямую - в тесте).
Для семафора(сервиса) устанавливаете максимальное число параллельно выполняемых запросов в качестве начального значения. При входе в обработчик захватываете семафор (Wait/WaitAsync, таймаут - по вкусу), при выходе (лучше - в блоке finally того try, который начинается после захвата семафора) - освобождаете (Release).
Таймаут выставляете в зависимости от поведения фронта: какие у него у самого таймауты на запрос (в том числе - на повторение) и как он реагирует на задержку ответа и на всякие разные коды статуса HTTP в ответе. В целом, стратегии тут две. Первая - пытаться захватывать семафор с коротким таймаутом и в случае неудачи - возвращать другой код статуса, кроме ОК, чтобы сказать фронту, что он не прав. Вторая - тормозить лишние запросы таймаутами. Кароче, без знания вашего фронтового плагина тут точно не скажешь, а я его знать не знаю и знать не хочу.
Ответ написан
Комментировать
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Лучше будет выставлять больший таймаут перед запросом. Т.е. если сейчас запрос делается спустя 0,5 сек после ввода, то сделай спустя 1 сек.

Либо, чтобы запрос выполнялся, когда ввода не было X секунд
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы