2009-08-26 3 views
0

Я создаю API для своего приложения Rails, и я хочу отслеживать, сколько раз пользователь вызывает конкретный метод API, и закрывать их, например, 1000 запросов в день. Я ожидаю очень высокие объемы запросов для нескольких пользователей.Самый быстрый способ отслеживания доступа к API

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

Я в порядке делаю задержанную запись (ограничение API не обязательно должно быть суперточным), но есть ли стандартный способ сделать это?

ответ

0

Вы можете попробовать Apigee. Похоже, что это «бесплатно до 10 000 сообщений в час».

Отказ от ответственности: Я никогда не использовал Apigee.

0

Это действительно зависит от # серверов, набор данных, то # пользователей и т.п.

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

Если точность квоты критическая, то, вероятно, лучше всего сделать это в БД. Вы можете сделать это в файле, но тогда вы сталкиваетесь с теми же проблемами, которые вы пытаетесь избежать/w в базе данных.

EDIT: Вы также можете использовать смешанный подход - поддерживать кеш-память на основе памяти пользователя api | invocation и периодически записывать их в базу данных.

Немного подробнее о требованиях помогло бы урезать варианты ..

+0

Ну, пока это один сервер. Я занимаюсь обработкой изображений (http://www.punypng.com) и создаю для него API. Я ожидаю, что многие пользователи будут использовать punypng для сжатия целых каталогов изображений (более 100 небольших изображений). Я думаю, мой вопрос в том, есть ли плагин или «Rails-way» этого. Memcache не вариант для меня, поэтому наличие структуры данных квот в памяти звучит как глобальные переменные для меня :( – chuboy

+0

Почему memcache не является для вас вариантом? – nitecoder

+0

Нет memcached, потому что в настоящее время я запускаю это на общем сервере (site5) от моего собственного копейки. – chuboy

0

Вот способ сделать это с помощью кэша рельсы

call_count_key = "api_calls_#{params[:api_key]}_#{Time.now.strftime('%Y-%m-%d-%Hh')}" 
call_count = Rails.cache.read(call_count_key) || 0 
call_count += 1 
Rails.cache.write call_count_key, call_count 

# here is our limit 
raise "too many calls" if call_count > 100 

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

0

Если у вас все в порядке с размещенным решением, взгляните на мою компанию WebServius (http://www.webservius.com), которая выполняет управление API (выдача ключей, применение квот и т. д.). У нас также есть поддержка биллинга, так что вы сможете установить цены за звонок и т. Д.

Смежные вопросы