Как ограничить скорость API

Каков наилучший способ ограничить запросы API? В принципе, мы хотим ограничить пользователей 360 запросами API в час (запрос каждые 10 секунд). На что приходит в голову отслеживать каждый запрос API и его хранение:

  ip-address          hourly-requests
  1.2.3.4             77
  2.3.4.5             34
  3.4.5.6             124

Если запросы ip-адреса больше 360, просто верните заголовок с помощью:

  429 - Too Many Requests

Затем откатывайте счетчик каждый час каждый час. Это кажется очень неэффективным методом, так как мы должны сделать запрос MySQL на каждый запрос API для увеличения счетчика. Кроме того, каждый час нам понадобится задача cron для reset всех счетчиков.

Есть ли более элегантное/эффективное решение?

Ответ 2

Я определенно не рекомендовал бы делать это с MySQL - проблема не столько в чтении, либо в неэффективности алгоритма, который вы выделяете там, но пишет. По мере увеличения объемов вы начнете получать многосекундные записи. Мы используем REDIS в качестве хранилища в качестве еще одного плаката, который уже упоминался, - он имеет атомные функции приращения/уменьшения, которые необходимы именно вам, - это очень быстро (в памяти) - вам просто нужно управлять осколками на сверхвысоких объемах (но это сверхвысокое значение на много порядков выше MySQL). Другой вариант, если вы не знакомы с REDIS, работает в Memcached, но он не так хорош на уровне операций.

Еще одним вариантом является использование чего-то вроде 3scale (http://www.3scale.net), который эффективно делает это для вас и других вещей (аналитика, управление ключами, документы разработчиков и т.д.). Существуют плагины кода для целого ряда языков (https://support.3scale.net/libraries), и они подключаются к инфраструктуре. Вы также можете использовать Varnish Libmod (https://github.com/3scale/libvmod-3scale/) и подключить его к кешу Varnish перед API.

Ответ 3

Попробуйте nginx. Ограничение скорости можно легко сделать, написав простые изменения в файле конфигурации. Кроме того, nginx работает быстро.

Ответ 4

Для идеального уровня производительности вы можете запустить легкую веб-фреймворк с функциями управления журналами в в базе данных для мониторинга и регистрации данных трафика, основываясь на IP или Пользователь или службе, вызываемой пользователем. Более важным выбором является хранилище данных, которое вы хотите использовать.

Лучшие и наиболее часто используемые бесплатные опции:

redis.io расширенное хранилище ключей

ehcache кеш, основанный на стандартах, активно развивается, поддерживается и поддерживается как профессиональный проект с открытым исходным кодом Terracotta

hazelcast с открытым исходным кодом Встроенная память данных для более быстрого выполнения и бесшовной масштабируемости

VoltDB операционная база данных в оперативной памяти

Ответ 5

В настоящее время я изучаю эту проблему. Мой текущий план (обратите внимание, что это со стеком LAMP!) Заключается в его реализации с использованием функций кэширования APC. Когда запрос получен, я проверяю, сохраняется ли этот IP-адрес в кэше APC. Если это так, проверьте, превышает ли он "X", где "X" - это максимальные запросы за единицу времени. Если это не так, создайте запись кэша для этого IP.

Эта система означает, что для проверки ограничения скорости не требуется доступ к базе данных, и она не полагается на что-либо вроде сервера MongoDB или Redis. Предполагается, что вы используете PHP с APC; если вы этого не сделаете, тогда memcached может работать.