fomvasss
@fomvasss
PHP developer

Как реализовать отправку данных с ограничением на количество запросов к внешнему сервису — 10 запросов в секунду?

Здраствуйте! В систему (Laravel) нужно интегрировать сервис рассылок (в даном случае SendPulse), в который будут закидыватся и обновлятся контакты клиентов.
В док. к SendPulse указано что у них есть "Ограничение на количество запросов - 10 запросов в секунду.".
Как в моей системе на Laravel возможно реализовать, чтобы она не делала больше 10 запросов в сек. к внешнему сервису SendPulse. Я понимаю, что можно как-то задачи кидать в очередь, но как ее выполнять с таким ограничением не могу понять?
  • Вопрос задан
  • 452 просмотра
Пригласить эксперта
Ответы на вопрос 3
pLavrenov
@pLavrenov
Разработка сайтов
Для этого надо использовать middleware для job. Я не знаю в какой версии оно появилось.

Метод middleware() добавляется в нужный Job
public function middleware()
    {
        return [
            new LimitJobThrottleMiddleware
        ];
    }


сам middleware выглядит так...

class LimitJobThrottleMiddleware
{
    public function handle($job, $next)
    {
        Redis::throttle('throttle:sync')
            ->allow(10) // Разрешено максимум 10 тасков
            ->every(1) // каждую секунду
            ->then(fn() => $next($job), fn() => $job->release());
    }
}

Важно! throttle:sync - должен быть уникальный. Все что превышает ограничение отправляется снова в очередь и ждет когда можно будет.
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
У вас час должно вариться варенье, его нужно помешивать, чтобы не подгорело, но нельзя его перемешивать более 10 раз за этот час, как это сделать?

Имеется:
- Варенье,
- Ложка
- Часы
Ответ написан
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
хранить время последнего запроса, хотя проще выбрать один из вариантов:
1. при ошибке от SendPulse с кодом "превышено кол-во запросов" выводить сообщение, о том что отправка возможна только через пару секунд.
2. если отправка через веб интерфейс, то отправляем ajax'ом запросы до тех пор пока SendPulse не вернет код 2хх
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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