Ahen
@Ahen
Универсальный дилетант

Как правильнее реализовать сбор данных обработчиком для последующего запроса к api в php?

php nginx apache2

Здравствуйте. Задача - на мой обработчик (php скрипт) по http приходят запросы, далее я разбираю данные запроса и совершаю запросы к внешним api.
Суть - лимит запросов к методу внешнего api равен 3 запроса в секунду.
Как это всегда бывает - неожиданно ко мне на сервис посыпались тысячи запросов в час и нередко выходит так, что данных запросов более чем 3 за 1 секунду. Все что свыше лимита отваливаются с ошибкой.

При этом у внешнего api предусмотрена возможность принятия комбинации запросов, в одно обращение можно уместить до 10 запросов к методам.

Как правильнее реализовать сбор запросов в группу и последующую работу с ними?
Сервер на linux с полным рутом.

Рассматривал вариант с хранением запросов в таблице mysql и обработчиком на cron, но разбор раз в минуту (насколько позволяет cron) это слишком долго. Необходимо обрабатывать запросы в течении 1-5 секунд.
  • Вопрос задан
  • 526 просмотров
Решения вопроса 1
Можно использовать - https://github.com/bandwidth-throttle/token-bucket
Оно позволит ограничить кол-во запросов в секунду ко внешнему сервису. Получится так - приходит внешний запрос, вы его тут же пытаетесь проксировать в сервис. Перед запросом пробуете получить токен $consumer->consume(1);, если токен получен, значит ещё нет 3х в секунду, если не получен, то будет задержка до ближайшего возможного времени.
Если же вам нужно ответить на запрос к вашему сервису максимально быстро, не дожидаясь ответа внешнего сервиса, то нужно использовать какой-нибудь сервис очередей. Внешний запрос добавит сообщение в очередь, а на вашем сервисе уже будет воркер, который его моментально попробует обработать.

В этих вариантах не используется функция отправки по 10 запросов, но думаю что для 1000 запросов в час этого хватить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы