Задать вопрос
Akuma
@Akuma
Веб-программист

Как ограничить вызов API тремя запросами в секунду?

API Вконтакте имеет ограничение на количество запросов: не более 3-х запросов в секунду. Ни много, ни мало, но все же с ним приходится мириться.

Вопрос в следующем: есть демон на PHP (без критики пожалуйста, отлично работает), который использует это API в несколько потоков (для нескольких пользователей). Нужно как-то синхронизировать вызов методов из всех потоков на "не более 3-х в секунду".

Решение "в лоб" - использовать некое "общее быстрое хранилище" для хранения информации о вызовах. Читать-проверять-вызывать.

Но, возможно, есть более элегантные или даже готовые решения?
  • Вопрос задан
  • 1461 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Ahen
@Ahen
Универсальный дилетант
Если "для нескольких пользователей", то ограничивать нужно каждый поток отдельно, ведь ограничение в 3 запроса накладывается на 1 токен.

Решение на php: пишем демона, который будет дергать запросы с базы данных (ну скорее всего в mysql) и выполнять их по очереди, соответственно удаляя из таблицы уже отработанные запросы. А ваши старые демоны будут складывать в базу данных эти запросы.

Если у вас небольшое приложение, то советую реализовать на nodejs, используя готовую либу vk-io https://github.com/negezor/vk-io . В данной либе реализован сбор запросов в execute, как итог - мы можем делать 75 запросов в секунду с одного токена.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
opium
@opium
Просто люблю качественно работать
ну юзеры разные просто в каждом потоке делайте делай на треть секунды
Ответ написан
@karminski
Senior React.JS Developer
А разве это не забота веб-сервера (типа nginx, apache)? Не скажу по настройкам, но мне кажется именно там и ставятся такие ограничения.
Ответ написан
angrySCV
@angrySCV
machine learning, programming, startuping
на АККА есть так называемый circuit breaker (реализующий этот подход) (на пхп вроде нет акка)
суть такая, есть посредник, который следит за исполнением запросов, через этот посредник отправляются все запросы, и он следит за их исполнением (в случае ошибок, пересылает заново, и тд).
Также например при обращении к нему этот посредник начинает считать количество обращений в течении одной секунды-> после 3х обращений, начинает через паузы в 1 секунду например отправлять дальше запросы)
как только, обращений меньше одного в секунду, счетчик сбрасывается.
В целом такой подход позволяет например по 3 обращений моментально делать, и только потом включать паузы, а также следить за исполнением этих запросов, без необходимости реализации такой логики непосредственно в самих вызовах.
Ну и конечно если у тебя такие потребности, то пора уже про пхп забыть)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы