Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумРазбор ошибок

429: что делать, кроме как ждать

batchrunner
batchrunner
Участник
сообщений 470
с окт
1 мая, 08:52первое сообщение

Гоняю выгрузку через открытый интерфейс площадки. Работает ровно часа полтора, потом начинает сыпаться 429. Я ставлю повтор сразу же, получаю тот же 429, повтор снова, и так по кругу.

К вечеру дошло до того, что меня перестали пускать вообще на час, даже с одного запроса в минуту. Понимаю, что сам себе устроил, но что тут правильно делать, кроме тупого ожидания?

queue_master
queue_master
Участник
сообщений 410
с ноя
8 октября, 11:09#2

Первое: перестаньте повторять мгновенно. Мгновенный повтор для считающей стороны это ещё один запрос, счётчик растёт, и вы загоняете себя глубже. Часовой запрет вы получили именно так.

Второе: посмотрите заголовки самого ответа 429. Там почти всегда лежит Retry-After, и он бывает в двух видах, числом секунд или датой. Число значит «подожди столько», дата значит «раньше этого момента не приходи». Если заголовок есть, спорить с ним смысла нет, он снимает весь вопрос.

Заодно поищите X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset. Остаток в этой тройке даёт возможность притормозить заранее, до первого отказа.

HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1739
очередь длиннее памяти
Полина Ждан
Полина Ждан
Новичок
сообщений 120
с мая, второй сезон
15 марта, 14:26#3

а если заголовка нет? у меня в ответе только код и пустое тело

queue_master
queue_master
Участник
сообщений 410
с ноя
22 августа, 17:43#4

Тогда пауза с ростом: секунда, две, четыре, восемь, потолок минута. И обязательно с разбросом, плюс-минус треть от текущей паузы, иначе все ваши потоки проснутся одновременно и ударят пачкой.

очередь длиннее памяти
batchrunner
batchrunner
Участник
сообщений 470
с окт
1 января, 08:00#5

Вставил рост с разбросом, стало заметно лучше. Но 429 всё равно приходит пачками: минут двадцать тихо, потом штук сорок подряд, потом снова тихо.

Ринат Ахметов
Ринат Ахметов
Участник
сообщений 700
с авг
8 июня, 11:17#6

Пачками потому, что вы лечите последствие. Пауза с ростом это разбор уже случившегося отказа, а частоту запросов у вас по-прежнему никто не держит.

Нужен ограничитель на своей стороне, общий на все потоки. Обычная схема с корзиной: в корзину капают талоны с нужной частотой, поток перед запросом забирает один, корзина пуста, значит ждёт. Тогда вы просто не выходите за лимит и 429 не видите вовсе.

import time, threading

class Korzina: def __init__(self, v_sekundu, zapas): self.tempo = v_sekundu self.zapas = zapas self.est = zapas self.metka = time.monotonic() self.zamok = threading.Lock()

def vzyat(self): while True: with self.zamok: seychas = time.monotonic() self.est = min(self.zapas, self.est + (seychas - self.metka) * self.tempo) self.metka = seychas if self.est >= 1: self.est -= 1 return spat = (1 - self.est) / self.tempo time.sleep(spat)

korzina = Korzina(v_sekundu=8, zapas=16) ```

Ставьте частоту процентов на двадцать ниже допустимой и держите корзину одну на процесс. Если процессов несколько, счёт ведите в общем месте, иначе каждый будет уверен, что укладывается, а площадка увидит сумму.

zavarka
zavarka
Участник
сообщений 435
с ноя
15 ноября, 14:34#7

Подтверждаю про сумму, поймал это же на трёх машинах. Каждая честно держала свои восемь запросов в секунду, площадка считала двадцать четыре и была права.

Быстрая проверка, укладываетесь ли вы, прямо по логу прогона:

сколько запросов в секунду уходит на деле
сколько запросов в секунду уходит на деле
чайник кипит, скрипт бежит
dobrynin_a
dobrynin_a
Знаток
сообщений 1690
с апр
22 апреля, 17:51#8
Ринат Ахметов: каждый будет уверен, что укладывается

Вдогонку момент, который упускают почти все: повторы тоже едят квоту. Считать надо все обращения, включая неудачные, иначе ваша корзина показывает восемь, а до площадки доезжает четырнадцать.

Полина Ждан
Полина Ждан
Новичок
сообщений 120
с мая, второй сезон
1 сентября, 08:08#9

о, вот про повторы я вообще не думала, спасибо

batchrunner
batchrunner
Участник
сообщений 470
с окт
8 февраля, 11:25#10

Отчитаюсь, раз тема помогла.

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

429 за эти трое суток не пришёл ни разу, выгрузка идёт даже быстрее прежнего: раньше половину времени я тратил на повторы по кругу. Порядок такой: сначала держать частоту, потом уже разбираться с отказами.