@Freerade

Как правильно делать паузы между запросами к api?

Как делать грамотно паузы между запросами к api? У api стоит ограничение на количество принимаемых запросов, не более 7 в 1 секунду, я сделал конечно вариант через рандомное число, которое потом помещается в sleep(), но все же этот вариант мне видится не очень, как делать правильно?
  • Вопрос задан
  • 470 просмотров
Решения вопроса 1
@rPman
На самом деле без знания, как именно сервис учитывает интервал времени, точный ответ на этот вопрос дать не получится и для действительной необходимости придется исследовать сервис, делая специально запросы чаще чем необходимо, выдерживая разный интервал времени (я помню как то для одной криптовалютной биржи заморочился и провел исследование, делая ряд запросов на грани бана и проверял, когда он появлялся, пытаясь вычислить эту ошибку,.. тольку от этого особого обычно нет, достаточно добавить с запасом +1 секунду и не заморачиваться).

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

Или же сервис может определить момент начал отсчета интервала, например как T-модуль деления (T/интервал), т.е. каждый интервал учета количества запросов для всех клиентов начинается с одного и того же времени, и сохранять для каждого пользователя количество сделанных запросов, сбрасывая в ноль это число при переходе к следующему интервалу. Само собой если количество это больше лимита то отказывать в обработке. Этот алгоритм можно расширить, к примеру хранить количество запросов за прошлый интервал (или несколько) и текущий, складывая их при проверке на лимит, в этом случае настоящий лимит, который указывается пользователям в документации, больше во столько раз, сколько хранится истории запросов для каждого пользователя.
(этот механизм проще для реализации на сервере, меньше требует памяти, и хотя не такой точный как первый, может использоваться)

...

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

Все вышесказанное тебе может не понадобиться, так как в подавляющем большинстве случаев сервер сообщает о количестве доступных запросов и/или времени, через которое можно будет сделать следующий вопрос прямо в ответе на каждый запрос. Для этого заводится соответствующий заголовок и это указывают в документации. В этом случае тебе достаточно будет проверять этот заголовок и делать sleep (точнее usleep) ровно таким, как указано там (там бывает пишут сразу timestamp, когда можно делать следующий запрос).

p.s. посмотри внимательно, возможно долбить сервис http rest запросами не самый лучший способ получения оперативной информации, вдруг сервис предлагает более удобные инструменты, например websocket или даже старый long pooling
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Вероятнее всего вы заняты не тем. Конечно, самый легкий и простой вариант это со стороны Frontend стучатся в API с криками "есть что?" десять раз в секунду, но для чего?. Это сулит большими проблемами, к примеру, если таких запросов несколько, то новое соединение для текущего клиента не будет открыто, пока не выполнится предыдущий API запрос. А если реализовать через мультипоточность на API-сервере, то могут возникнуть проблемы с количеством запросов, как минимум можно скушать пару ГБ ОЗУ из-за сотен запросов за пару секунд от разных клиентов.

Я не совсем понимаю вашу конкретную задачу, но я описал проблемы выше, может быть стоит не спрашивать у API "есть что новое?" несколько раз в секунду, а со стороны API говорить фронтенду о текущем состоянии и обновлять данные, если это действительно необходимо? Смотрите в сторону сокетов, они хорошо работают на стороне бекенда (если это PHP или не дай боже Python) и с ними легко работать на JS.
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Перед каждым запросом к api добавить задержку в 0.143 секунды что гарантированно позволит делать не более 7 запросов в секунду
<?php

usleep(143000);
//запрос к api


метод самый простой самый тупой и надежный, если конечно api долбим в 1 поток
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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