Регулирование исходящих вызовов API, генерируемых приложением Rails - PullRequest
12 голосов
/ 11 мая 2010

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 28 июля 2011

Попробуйте использовать nginx в качестве прокси: http://codetunes.com/2011/07/26/outbound-api-rate-limits-the-nginx-way.

Если вы на герою, подумайте об использовании Slow Web gem.

2 голосов
/ 20 июля 2015

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

require 'throttle-queue'

q = ThrottleQueue.new 3
files.each {|file|
    q.background(file) {
        fetch file
    }
}
0 голосов
/ 11 мая 2010

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

ri Kernel#sleep

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...