Я разрабатываю простой REST API, используя Spring 3 + Spring MVC. Аутентификация будет выполняться через OAuth 2.0 или basic auth с помощью токена клиента с помощью Spring Security. Это все еще обсуждается. Все соединения будут принудительно подключены через SSL-соединение.
Я искал информацию о том, как реализовать ограничение скорости, но похоже, что там много информации. Реализация должна быть распределена, поскольку она работает на нескольких веб-серверах.
Например, если есть три сервера api, A, B, C и клиенты ограничены 5 запросами в секунду, то клиент, который делает 6 запросов, как это, найдет запрос на C, отклоненный с ошибкой.
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
Он должен работать на основе токена, включенного в запрос, поскольку один клиент может делать запросы от имени многих пользователей, и каждый пользователь должен быть ограничен лимитом, а не IP-адрес сервера.
Настройка будет представлять собой несколько (2-5) веб-серверов за балансировщиком HAProxy. Существует Cassandra, и memcached используется. Веб-серверы будут работать на Jetty.
Одним из возможных решений может быть создание настраиваемого фильтра безопасности Spring, который извлекает токен и проверяет, сколько запросов было выполнено с ним за последние X секунд. Это позволило бы нам сделать некоторые вещи, как разные лимиты ставок для разных клиентов.
Любые предложения о том, как это можно сделать? Есть ли существующее решение или мне придется написать собственное решение? Раньше я не делал много инфраструктуры веб-сайта.