Как ограничить скорость 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 для сброса всех счетчиков каждый час.

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


person Justin    schedule 08.01.2012    source источник
comment
Для более гибкого подхода вы можете взглянуть на алгоритм Token Bucket. Счетчики должны храниться в некотором хранилище памяти для повышения производительности.   -  person botchniaque    schedule 02.07.2015


Ответы (5)


Вы можете попробовать использовать Redis, есть несколько шаблонов для ограничения скорости

person Alehandro Sanchez    schedule 09.02.2013

Я определенно не рекомендовал бы делать это с 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.

person steve    schedule 03.06.2012

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

person Kartik Goyal    schedule 11.02.2015

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

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

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

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

hazelcast In-Memory Data Grid с открытым исходным кодом для более быстрого выполнения и эластичной масштабируемости.

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

person kommradHomer    schedule 21.02.2014

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

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

person Mechcozmo    schedule 05.03.2012