Отмена исходящих вызовов API, созданных приложением Rails

Я не профессиональный веб-разработчик, но мне нравится гадать на сайтах как хобби. Недавно я играл с разработкой приложения Rails в качестве проекта, чтобы помочь мне изучить структуру. Цель моего игрушечного приложения - собрать данные из другой службы через их API и сделать ее доступной для запроса с помощью функции поиска.

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

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

Будучи и любительским веб-разработчиком, и новичком-рельсами, вполне возможно, что я выполнял неправильные запросы в неправильных местах. Поэтому мои вопросы:

  • Есть ли хороший сайт, в котором собраны учебные пособия Rails, в которых есть материал, связанный с дросселированием исходящих запросов API?

  • Есть ли какие-либо рубиновые драгоценные камни или другие библиотеки, которые помогут мне разогнать запросы?

У меня есть некоторые идеи о том, как я мог бы писать систему дросселирования, используя рабочего процесса на основе очереди, такого как DelayedJob или Resque, для управления вызовами API, но я предпочел бы потратить выходные дни на остальную часть сайта, если есть хорошее готовое решение уже там.

Ответ 1

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

ri Kernel#sleep

Итак, если вам разрешено 10 апи-вызовов за минуту, вы просто спите (6) после каждого звонка

Ответ 3

Теперь для этого есть камень: throttle-queue. Он берет блок кода и гарантирует, что он будет выполняться только x раз в секунду. Это пример, взятый из Readme, который будет извлекать только три файла в секунду:

require 'throttle-queue'

q = ThrottleQueue.new 3
files.each {|file|
    q.background(file) {
        fetch file
    }
}