Лучшая практика для пользователей, ограничивающих скорость REST API?

StackOverflow https://stackoverflow.com/questions/614728

Вопрос

Я собираю REST API, и, поскольку я не уверен, как он будет масштабироваться или каков будет спрос на него, я хотел бы иметь возможность ограничивать его использование, а также иметь возможность временно отклонять запросы, когда коробка переполнена или существует какой-то сценарий, отмеченный пунктиром.

Я также хотел бы иметь возможность корректно временно отключить службу (при этом предоставляя клиентам результаты, указывающие на то, что основная служба на некоторое время отключена от сети), когда/если мне нужно масштабировать службу, добавляя дополнительную емкость.

Есть ли какие-либо лучшие практики для такого рода вещей?Реализация — Rails с MySQL.

Это было полезно?

Решение

Все это делается с помощью внешнего веб-сервера, который слушает мир (я рекомендую nginx или Lighttpd).

Что касается ограничений скорости, то nginx умеет ограничивать, т.е.50 запросов в минуту на каждый IP, всего получается страница 503, которую вы можете настроить.

Что касается ожидаемого временного отключения, в мире рельсов это делается через специальную страницу Maintenance.html.Существует какая-то автоматизация, которая создает или символизирует этот файл, когда серверы приложений Rails выходят из строя.Я бы рекомендовал полагаться не на наличие файла, а на реальную доступность сервера приложений.

Но на самом деле вы можете запускать/останавливать службы, вообще не теряя соединения.Т.е.вы можете запустить отдельный экземпляр сервера приложений на другом сокете/IP-порте UNIX, и балансировщик (nginx/lighty/haproxy) также будет использовать этот новый экземпляр.Затем вы закрываете старый экземпляр, и все клиенты обслуживаются только новым.Никакая связь не потеряна.Конечно, этот сценарий не всегда возможен, это зависит от типа изменений, которые вы внесли в новую версию.

haproxy — это решение только для балансировщика.Он может чрезвычайно эффективно балансировать запросы к серверам приложений в вашей ферме.

Для довольно большого сервиса вы получите что-то вроде:

  • api.domain разрешает балансировщики N циклического перебора
  • каждый балансировщик передает запросы на веб-серверы M для статического контента и серверы приложений P для динамического контента.Ну что ж, в вашем REST API нет статических файлов, не так ли?

Для совсем небольшого сервиса (менее 2 тыс. запросов в секунду) вся балансировка выполняется внутри одного-двух веб-серверов.

Другие советы

Хорошие ответы уже есть - если вы не хотите реализовывать ограничитель самостоятельно, есть еще такие решения, как 3scale(http://www.3scale.net), который выполняет ограничение скорости, аналитику и т. д.для API.Он работает с помощью плагина (см. здесь плагин Ruby API), который подключается к архитектуре 3scale.Вы также можете использовать его через лак и использовать лак в качестве прокси-сервера, ограничивающего скорость.

Я бы порекомендовал ввести ограничения скорости вне вашего приложения, так как в противном случае высокий трафик все равно будет приводить к уничтожению вашего приложения. Хорошее решение - внедрить его как часть вашего прокси-сервера Apache с помощью чего-то вроде mod_evasive

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top