Отмена исходящих вызовов API, созданных приложением Rails
Я не профессиональный веб-разработчик, но мне нравится гадать на сайтах как хобби. Недавно я играл с разработкой приложения Rails в качестве проекта, чтобы помочь мне изучить структуру. Цель моего игрушечного приложения - собрать данные из другой службы через их API и сделать ее доступной для запроса с помощью функции поиска.
Однако служба, которую я хочу вытащить данные, накладывает ограничение скорости на количество вызовов API, которые могут выполняться в минуту. Я планирую, что мое приложение запускает ежедневное обновление, которое может генерировать пакет вызовов API, который намного превышает лимит, предоставляемый внешней службой. Я хочу уважать производительность внешнего сайта и поэтому хотел бы снизить скорость, с которой приложение выполняет вызовы.
Я немного поработал и подавляющее количество материалов для учебников и предварительно построенных библиотек, которые я нашел, закрыл дросселирование входящих API-вызовов в веб-приложение, и я не могу найти небольшое обсуждение управления потоком исходящих вызовов.
Будучи и любительским веб-разработчиком, и новичком-рельсами, вполне возможно, что я выполнял неправильные запросы в неправильных местах. Поэтому мои вопросы:
-
Есть ли хороший сайт, в котором собраны учебные пособия Rails, в которых есть материал, связанный с дросселированием исходящих запросов API?
-
Есть ли какие-либо рубиновые драгоценные камни или другие библиотеки, которые помогут мне разогнать запросы?
У меня есть некоторые идеи о том, как я мог бы писать систему дросселирования, используя рабочего процесса на основе очереди, такого как DelayedJob или Resque, для управления вызовами API, но я предпочел бы потратить выходные дни на остальную часть сайта, если есть хорошее готовое решение уже там.
Ответы
Ответ 1
Причина, по которой никто не говорит об исходящем дросселировании, заключается в том, что она обычно довольно тривиальная, так как вы управляете ею. Управление пропускной способностью может быть немного сложнее, но контроль количества запросов?
ri Kernel#sleep
Итак, если вам разрешено 10 апи-вызовов за минуту, вы просто спите (6) после каждого звонка
Ответ 2
Попробуйте использовать nginx в качестве прокси: http://codetunes.com/2011/07/26/outbound-api-rate-limits-the-nginx-way.
Если вы находитесь на геройку, подумайте об использовании Slow Web.
Ответ 3
Теперь для этого есть камень: throttle-queue. Он берет блок кода и гарантирует, что он будет выполняться только x раз в секунду. Это пример, взятый из Readme, который будет извлекать только три файла в секунду:
require 'throttle-queue'
q = ThrottleQueue.new 3
files.each {|file|
q.background(file) {
fetch file
}
}