Я довольно нов, когда дело доходит до Horizon и Queues, и я столкнулся с этой проблемой.
Я использую Horizon + Redis для своих очередей. Задания в очереди должны подключаться к удаленной службе и получать некоторые данные. Эта служба имеет некоторые ограничения на соединение (например, 5 запросов в минуту и X запросов в час / день). Иногда он также может быть недоступен или недоступен для обслуживания.
Теперь у меня может быть много этих заданий в очереди (например, 10 КБ или даже больше). И после 5-го запроса в данную минуту (или каков фактический лимит) все оставшиеся попадания вернутся ложными, и мне просто придется их отложить.
Затем, после того, как первое задание будет отложено, все задания, которые последуют за ним, также попытаются подключиться к удаленному сервису, также потерпят неудачу и будут задержаны. И это фактически задержит количество заданий до тех пор, пока служба не сможет снова принять соединения.
Это создает две проблемы:
- Это задерживает много заданий, поэтому после 5 или 10 повторных попыток в итоге возникнет сбой, что приведет к массе неудачных заданий.
- Это приведет к ряду ненужных подключений к услуге, которые я уже исчерпал. Некоторым службам это не нравится, и они будут еще больше задерживать ...
Было бы хорошо, если бы я мог как-то приостановить все задания в данной очереди или просто занять 5 заданий в минуту. Худшее решение, вероятно, это просто sleep () в течение 25 секунд, но событие hat не сработает, если будет более одного работника.
Я пытался использовать дросселирование redis:
Redis::throttle('key')->allow(10)->every(60)->then(function () {
// Job logic...
}, function () {
// Could not obtain lock...
return $this->release(10);
});
но я либо что-то сделал не так (настройка ключа), либо что-то в этом роде, но после того, как первые 10 заданий будут выполнены в минуту, другие просто откладываются с выпуском (10), и у меня возникает та же проблема, что и описанная выше.
Я уверен, что у кого-то была такая проблема, и мне любопытно, как правильно подойти к этому.
Заранее спасибо за помощь!