Регулирование пропускной способности на серверах RESTful

Это немного теоретический вопрос, но с некоторых пор он меня беспокоил.

Фон

Предположим, вы создали хороший сервис RESTful для некоторых крайне изменчивых данных. Ваши пользователи должны будут часто запрашивать RESTful-сервер, чтобы получить изменения. Тем не менее, очень много запросов нагружают сервер довольно сильно. Кроме того, на самом деле может быть не слишком много смысла делать запросы чаще, чем раз в 30 секунд. Поскольку запрос параметризован, бессмысленно что-либо предварительно вычислять и обслуживать из кэша. Поэтому вам нужно как-то ограничить пользователя от слишком частого доступа к вашему ресурсу.

Вопрос

Как вы можете ограничить пользователя, подавляя его запросы, не нарушая RESTful-парадигму несохранения состояния на сервере?

Мое нынешнее мышление

Мой сервис теперь создает вспомогательную карту, которая содержит временную метку текущего запроса вместе с токеном доступа. Служба отвечает с ошибкой http 429 (слишком много запросов), если последний доступ к конечной точке RESTful был менее 30 секунд назад. Это ломает ОТДЫХ.

Альтернативная идея

Я мог бы отправить время доступа вместе с зашифрованным закрытым ключом. Затем клиент должен будет отправить этот ключ вместе для следующего запроса. Мой сервер расшифровывает его и решает, может ли клиент выполнить запрос. Это много накладных расходов, кажется...

твист

Ситуация усложняется, поскольку у меня на сервере RESTful разные конечные точки, к которым должны применяться разные ограничения времени доступа. Один запрос в основном создает полный дамп базы данных - он предназначен только для того, чтобы клиент мог получить текущее состояние всего, но его не следует использовать для запроса снова и снова.

Как бы вы попытались реализовать такое требование на сервере RESTful? Должен ли я продолжать свой подход, хотя он явно вводит состояние? Кто-нибудь имеет опыт работы с зашифрованным состоянием, которое можно безопасно передавать, не опасаясь манипуляций на стороне клиента?

Это отличается от

Если REST-приложения должны быть без сохранения состояния, как вы управляете сессиями?

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

Вопрос в том, как реализовать регулирование на сервере RESTful и сохранить преимущества высокой масштабируемости REST. Каковы лучшие практики для этого. Мой вопрос конкретно о том, чтобы заставить работать дросселирование. Клиенту нельзя доверять сохранение состояния, так что передача состояния в смысле REST не будет работать. Как другие решают это?

0 ответов

Другие вопросы по тегам