Code Monkey home page Code Monkey logo

redis-aiohttp's Introduction

Применение 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 запросов в секунду.

redis-aiohttp's People

Contributors

getbyid avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.