Наилучшая практика для пользователей REST API с ограничением скорости? - PullRequest
30 голосов
/ 05 марта 2009

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

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

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

Ответы [ 3 ]

18 голосов
/ 05 марта 2009

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

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

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

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

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

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

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

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

5 голосов
/ 05 июня 2012

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

2 голосов
/ 05 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...