«По душе» · ingestion · продуктовый отчёт
Полная cron-волна по 25 площадкам, запущенная под живым наблюдением на сервере разработки: что привезли, сколько это стоило по времени и запросам, что из собранного готово к ленте, какие проблемы всплыли и что с ними сделано.
Волна шла с 09:23 до 13:26 UTC (~4 часа, включая 8-минутный разрыв на рестарт сеанса наблюдения); режим — ночной, полный (--refresh-all): детали качались даже у неизменившихся анонсов, попутно каталог запомнил отпечатки для дневной экономии.
После волны тем же вечером прогнан контрольный пропускающий проход (как дневная волна: деталь не качается, если анонс не менялся) по четырём площадкам. Три ускорились в 3–5 раз; nethouse — нет, и это не поломка: его список не показывает дат, а правило безопасности «пропускать только датированные анонсы» главнее скорости.
| Площадка | Полный | Пропуск | Деталей пропущено | Скачано заново | Запросы: было → стало |
|---|---|---|---|---|---|
| afisha | 120м51с | 38м07с | 8 019 | 2 502 | 11 033 → 3 064 (−72%) |
| nethouse | 84м30с | 82м38с | 839 | 5 606 | 16 260 → 15 441 (−5%) |
| bileter | 18м09с | 3м52с | 2 426 | 240 | 2 971 → ~530 (−82%) |
| radario | 9м41с | 1м47с | 2 017 | 5 | 2 146 → 115 (−95%) |
Совпадение отпечатков — 100% там, где им положено совпадать (radario 2021/2021). Механизм внедрён на 17 площадках из 25; крупнейший неохваченный кандидат — timepad (деталь через браузер ~2,5 с, следующий шаг).
| Площадка | Время | Статус | Записей | Запросов | Комментарий |
|---|---|---|---|---|---|
| kassir | 75м51с | успех | 14 065 | 12 685 | крупнейший привоз волны |
| gorodzovet | 80м59с | успех | 12 029 | 13 496 | обход календаря по дням |
| yandex_afisha | 52м01с | частично | 10 805 | 12 272 | 6 ошибок деталей — баг №2, починен |
| mtslive | 95м11с | успех | 10 112 | 11 819 | самый долгий в волне |
| afisha | 120м51с | частично | 9 653 | 11 033 | анти-бот пройден лестницей httpx→curl |
| russpass | 23м20с | частично | 4 068 | 6 662 | 11 мелких ошибок деталей |
| bileter | 18м09с | успех | 2 662 | 2 971 | |
| nethouse | 84м30с | успех | 2 050 | 16 260 | два хоста, тяжёлые формы |
| radario | 9м41с | успех | 2 035 | 2 146 | |
| ticketland | 30м36с | успех | 1 902 | 2 107 | |
| kudago | 1м43с | успех | 1 566 | 24 | эталон экономности: 65 событий на запрос |
| leader_id | 12м39с | частично | 904 | 1 852 | 55 городов; одна страница отдала 422 |
| timepad | 17м15с | частично | 765 | 815 | обложки 763/765; в 3 городах из 8 не прочитались категории |
| dobro | 1м45с | успех | 515 | 74 | после фикса бага №1; без обложек до обновления ключа |
| all_events | 2м26с | успех | 456 | 93 | |
| intickets | 1м41с | успех | 144 | 316 | |
| hse | 1м33с | успех | 58 | 111 | 4 кампуса |
| venue_cals | 0м31с | успех | 32 | 82 | 3 сайта параллельно — первый прогон после фиксов |
| qtickets | 0м12с | успех | 27 | 30 | |
| habr_events | 0м11с | успех | 15 | 28 | |
| ithrhub | 0м05с | частично | 6 | 7 | 4 карточки-брака отсеяны нормализацией |
| vk | 1м14с | красный | 0 | 207 | токен привязан к IP прод-машины — среда |
| data_mos | 34м06с | красный | 0 | 11 | apidata.mos.ru не отвечает с этого сервера |
| opendata_mkrf | 3м16с | красный | 0 | 6 | хост недоступен отсюда (и повтор тоже) |
| mosafisha | 9м03с | красный | 0 | 3 | bilet.mos.ru не отвечает — известное ограничение |
Все четыре красных — ограничения сервера разработки (недоступность инфраструктуры mos.ru/mkrf, привязка ключа ВК к IP), не дефекты кода: с прод-машины оператора эти же площадки собираются.
Проверено не приближением, а настоящей проекцией экспорта — той же функцией, которая отдаёт карточки стенду, со всеми её правилами (обязательная ссылка на источник, обложка, интересы, место, окно 45 дней).
Крупнейшие поставщики готовых карточек: gorodzovet 9 250, mtslive 7 010, kassir 6 309, yandex_afisha 5 175, afisha 4 808. Требование «обложка обязательна» работает как задумано: например, 515 событий Добра, собранных без ключа картинок, честно ждут в каталоге и в ленту не идут — обложки доберутся штатным скриптом после обновления ключа.
reason: unconfigured).Протухший JWT (нужен только для картинок) прикладывался к каждому запросу, и площадка отвечала 401 даже на публичные пути. Починено в ходе волны: мёртвый токен больше не прикладывается, в статистике появился честный флаг bearer_expired. Повторный прогон: успех, +515 событий. Добавлены 4 юнит-теста.
NameError: interruptible_sleep — при переезде пауз на общие ворота хоста имя выпало из импорта, а ветка ретрая его зовёт. Ошибка жила только в живом ретрае и стоила деталей, не прогона. Починено + AST-сторож на весь класс таких обрывов по всем 22 модулям коллекторов.
Инфраструктура mos.ru (data_mos, mosafisha) и opendata.mkrf.ru отсюда не отвечают вовсе; пользовательский ключ ВК привязан к IP прод-машины. Код исправен — с машины оператора эти источники собираются.
Timepad: в 3 городах из 8 не прочитались разделы категорий (события собраны, но размечены слабее — интересы добираются фолбэком по тексту). Nethouse: экономия пропуска структурно ограничена — список площадки не несёт дат. Leader-ID: одна страница отдала 422, сбор честно доехал остальное.
Первый боевой прогон всех фиксов вчерашнего ревью: параллельный обход трёх календарей площадок, проводка ночного режима, счётчики цены прогона (запросы/ожидание) во всех статистиках, журнал склеек, корректный якорь админки в тревоге.
INGESTION_ALERT_WEBHOOK — тревога полностью готова и уже ловит настоящие проблемы, ей некуда писать.