8000 GitHub - getbyid/redis-aiohttp: Применение Redis в приложении aiohttp · GitHub
[go: up one dir, main page]

Skip to content

getbyid/redis-aiohttp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Применение Redis в приложении aiohttp для ограничения частоты запросов

Ограничение на уровне роута

Имеем HTTP-API на основе aiohttp.

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

При каждом запросе ID пользователя передаётся в функцию rate_exceeded из app/redis.py. Можно задать любой предел частоты и интервал учёта запросов. Их значения по-умолчанию: разрешено 10 запросов в секунду, учитываются запросы не далее 1 секунды назад.

Запуск в контейнерах

docker compose up
...
docker compose stop
docker compose rm

Запуск без контейнеров

Необходим запущенный локально Redis-сервер и виртуальное окружение Python:

python3 -m venv venv
. venv/bin/activate
(venv) pip install aiohttp redis
(venv) REDIS_URL=redis://localhost/0 python3 -m app
...
(venv) deactivate

Проверка работы ограничения

Возьмём современный инструмент для нагрузочного тестирования Grafana k6. Нагрузим API параллельными HTTP-запросами 30 секунд:

$ k6 run ./k6/get.js 

          /\      |‾‾| /‾‾/   /‾‾/   
     /\  /  \     |  |/  /   /  /    
    /  \/    \    |     (   /   ‾‾\  
   /          \   |  |\  \ |  (‾)  | 
  / __________ \  |__| \__\ \_____/ .io

  execution: local
     script: ./k6/get.js
     output: -

  scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
           * default: 10 looping VUs for 30s (gracefulStop: 30s)


     200 OK.........................: 300    9.998438/s
     429 Too Many Requests..........: 56317  1876.940127/s
...

Видим, что за 30 секунд успешно прошло ровно 300 запросов, остальные были отброшены. Это точно соответствует заданному в API ограничению: 10 запросов в секунду.

About

Применение Redis в приложении aiohttp

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

0