fix(tradein/scrapers): обрыв по серии блоков рвал каждый прогон, включая здоровые #3188
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3188
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3184-block-ratio-threshold"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Суть
Все 40 прогонов
avito_detail_backfillза 14 суток закончилисьbanned. Ни один не завершился штатно. Доля блоков при этом колебалась 25-100%:Прогон, честно обогативший 125 карточек из 190, получал тот же статус, что и прогон 0 из 5.
Обрывало правило «N блоков подряд». Оно не отличает выгоревший пул от здорового сбора, потому что блоки автокоррелированы и идут пачками: при базовой доле 25-46% пачка из 5-6 подряд у независимой модели была бы редкостью, а встречается в каждом прогоне. Критерий, срабатывающий всегда, не несёт информации.
Что изменено
BlockRatioBreaker— доля блоков в скользящем окне последних N попыток. Дефолт: окно 20, порог 0.7, оба в настройках с валидацией диапазона (ge=1,0.0..1.0— оператор, введший70вместо0.7, получит ошибку, а не молча выключенный критерий).countersпишется гистограмма длин пачек. Без неё эффект этой и любой следующей правки измерить нечем — сегодня там только итоги.Safety-net и почему он с условием
Старое поведение сохранено, но только для прогонов короче окна, где доля физически недостижима: 0/5 останавливается как раньше.
Без этого условия safety-net гасил бы сам фикс. Холодный старт сессии/прокси — самое вероятное место пачки, и длинный прогон обрывался бы на пятой попытке точно так же, как до правки, не дав критерию по доле включиться. Найдено ревью, исправлено.
Чего этот PR НЕ делает
Домклик не трогаем. Исходная постановка (моя) говорила «тот же критерий», но у Домклика один выделенный residential-прокси без ротации, и
max_consecutive_blocks=3у него ниже avito осознанно —data/sql/175_scrape_schedules_seed_domclick_detail_backfill.sql:41-44объясняет: ранний обрыв бережёт репутацию единственного узла.Наша калибровка сделана на пуле с ротацией. При устойчивой доле около 0.65 Домклик по этому критерию не оборвался бы никогда — десятки запросов по QRATOR с одного IP, ровно то, что порог 3 был призван предотвратить. Данных по Домклику у нас ноль. Своя калибровка — отдельной задачей.
Тесты
30 в файле avito, включая новые в обе стороны:
{"6": 1};>=), 13/20 нет;Test plan
done, а неbannedcountersпоявиласьblock_streak_histogram— по ней впервые можно будет измерить реальную длину пачекCloses #3184