Регулирование пропускной способности на серверах RESTful
Это немного теоретический вопрос, но с некоторых пор он меня беспокоил.
Фон
Предположим, вы создали хороший сервис RESTful для некоторых крайне изменчивых данных. Ваши пользователи должны будут часто запрашивать RESTful-сервер, чтобы получить изменения. Тем не менее, очень много запросов нагружают сервер довольно сильно. Кроме того, на самом деле может быть не слишком много смысла делать запросы чаще, чем раз в 30 секунд. Поскольку запрос параметризован, бессмысленно что-либо предварительно вычислять и обслуживать из кэша. Поэтому вам нужно как-то ограничить пользователя от слишком частого доступа к вашему ресурсу.
Вопрос
Как вы можете ограничить пользователя, подавляя его запросы, не нарушая RESTful-парадигму несохранения состояния на сервере?
Мое нынешнее мышление
Мой сервис теперь создает вспомогательную карту, которая содержит временную метку текущего запроса вместе с токеном доступа. Служба отвечает с ошибкой http 429 (слишком много запросов), если последний доступ к конечной точке RESTful был менее 30 секунд назад. Это ломает ОТДЫХ.
Альтернативная идея
Я мог бы отправить время доступа вместе с зашифрованным закрытым ключом. Затем клиент должен будет отправить этот ключ вместе для следующего запроса. Мой сервер расшифровывает его и решает, может ли клиент выполнить запрос. Это много накладных расходов, кажется...
твист
Ситуация усложняется, поскольку у меня на сервере RESTful разные конечные точки, к которым должны применяться разные ограничения времени доступа. Один запрос в основном создает полный дамп базы данных - он предназначен только для того, чтобы клиент мог получить текущее состояние всего, но его не следует использовать для запроса снова и снова.
Как бы вы попытались реализовать такое требование на сервере RESTful? Должен ли я продолжать свой подход, хотя он явно вводит состояние? Кто-нибудь имеет опыт работы с зашифрованным состоянием, которое можно безопасно передавать, не опасаясь манипуляций на стороне клиента?
Это отличается от
Если REST-приложения должны быть без сохранения состояния, как вы управляете сессиями?
Приведенный выше вопрос обсуждает общую идею серверных API-интерфейсов RESTful, и я, как мне кажется, хорошо понимаю эту концепцию. Вопрос здесь о дизайне, а не о том, нарушает ли мой дизайн REST и почему.
Вопрос в том, как реализовать регулирование на сервере RESTful и сохранить преимущества высокой масштабируемости REST. Каковы лучшие практики для этого. Мой вопрос конкретно о том, чтобы заставить работать дросселирование. Клиенту нельзя доверять сохранение состояния, так что передача состояния в смысле REST не будет работать. Как другие решают это?