LINUX.ORG.RU

Синхронная обработка конечного числа запросов

 , , ,


0

2

Есть сервис А который посылает запросы на API сервиса B. Но сервис В не может обрабатывать запросы одновременно (ломается на 2000 в секунду) и есть лимит в 10000 в день. Клиент А это должен учитывать и иметь доступ к переменной которая условно равна количеству доступных запросов на API B в определённый момент времени, что бы её можно можно было отобразить на сайте и притом иметь регулировку по количеству запросов на сервер в секунду. Может я не туда думаю, но это делается через очереди + воркеры или можно проще?


Чтобы ограничить количество одновременны запросов можно использовать asyncio.Semaphore. А общий счётчик лучше хранить где-то во вне, например в редисе, на случай перезапуска сервиса. При старте получаешь c помощью GET (или устанавливаешь 0 c помощью SET, если ключа нет) текущее значение и считаешь локально, не забывая делать INCR.

Если инстансов более одного, то сложнее, но принцип тот же.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Спасибо! Вроде то что нужно, как раз хотел с учётом нескольких копий приложений реализовать этот функционал. Почему исправили? Вроде как если инстансов более одного они все читают-пишут одну БД и не выходят за пределы ограничения.

Cirno ()
Последнее исправление: Cirno (всего исправлений: 1)
Ответ на: комментарий от Cirno

При несколькх воркерах, конечно, локально уже считать не получится. Разве что при условии round-robin и только примерно, делая ctx.counter += num_workers, а потом выравнивать гетом при кратности 100, например. А для значения семафора можно взять что-то наподобие requests_limit_per_second / (1000 / average_request_duration_ms) / num_workers. Если инстансу количество воркеров вообще будет известно. Если нет, то нужен балансировщик. Nginx, вроде, умеет ограничивать rps.

А ещё нужно как-то занулять суточный счётчик.

Так-то задачка сложнее чем кажется. Может быть кто-то из лоровцев подскажет более элегантное, а то и готовое решение.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)