feat(tradein/cian): у Циана не было добора карточек — только побочный эффект задачи про историю (#3284) #3285

Merged
lekss361 merged 1 commit from feat/3284-cian-detail-backfill into main 2026-08-30 12:41:37 +00:00
Owner

Закрывает #3284.

Что не так

У avito, domclick и yandex есть выделенный *_detail_backfill. У Циана его не было вообще: карточки доставались побочным эффектом cian_history_backfill — суточной задачи про историю цен, — а её выборка ключуется по offer_price_history, не по наличию карточки.

Замер на 30.08:

источник объявлений с карточкой доля
avito 57 516 13 689 23.8%
cian 25 222 4 494 17.8%
yandex 21 653 10 729 49.5%
domklik 8 412 6 411 76.2%

Циан — второй по объёму и последний по полноте. Без истории цен 19 046 объявлений при квоте batch_size=100 в сутки: 190 дней на текущий остаток, притом что Циан приносит ~4 900 объявлений за двое суток — очередь растёт примерно вдвадцатеро быстрее, чем разбирается.

И отдельно: 1 697 объявлений имеют историю цен, но не имеют карточки. Раз выборка ключуется по истории, для неё они уже обработаны и не вернутся никогда.

При этом фетчер исправен. Прогоны 5154 / 5240 / 5328 — 100/100, 99/100, 100/100, остановка ровно на batch_size, а не по блокам, бюджету или окну. Чинить нечего: не выдана мощность.

Правка

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

  • listings_pending="detail" — выборка по detail_enriched_at IS NULL, свежие первыми (ORDER BY last_seen_at DESC). Очередь заведомо длиннее батча, поэтому порядок решает, что успеем добрать, а по свежим считается оценка.
  • Историческая выборка оставлена побайтово, включая отсутствие сортировки: по ней живёт суточный прогон, и менять её правкой про карточки нельзя.
  • Неизвестное значение — ValueError, а не молчаливый откат на дефолт. Опечатка в default_params иначе дала бы прогон с нулём добранных карточек, выглядящий штатно: очередь якобы пуста.
  • do_houses=false у нового расписания: дома разбирает суточный сосед.

Окно 0–23, как у avito_detail_backfill и yandex_detail_backfill. Трёхчасовое здесь бессмысленно: прогон 5328 уложился в 54 минуты из трёх часов, две трети окна простаивали, а очередь росла.

batch_size=400 — арифметика, не вкус. Замеренный темп ~28 с на объявление; порог reap_zombies — 6 ч по heartbeat_at; бюджетного сторожа у backfill_cian_history нет, единственный ограничитель — размер батча. 400 × 28 с ≈ 3.1 ч проходит; 800, как у Яндекса, дало бы ≈6.2 ч и прогон убивало бы жнецом.

enabled=false, как domclick_detail_backfill в миграции 175. Причина не в куках (гейт _cian_pre_claim общий с историей и проходит), а в нагрузке: это третий круглосуточный добор на общий пул из четырёх узлов. Включу отдельным шагом после деплоя и посмотрю на соседей.

Тесты

13 проверок: ключ выборки, порядок, скоуп по источнику, неизменность прежнего режима, доезд listings_pending и batch_size до SQL, проводка параметров через посредника _execute_cian_backfill, регистрация обоих source и общий гейт кук.

Проверено мутациями — каждая роняет свои тесты:

мутация падает
снять ORDER BY в detail-выборке 1
молчаливый дефолт вместо ValueError 2
потерять listings_pending в посреднике 2

Набор целиком — 5196 passed, 37 skipped.

Чего эта правка НЕ делает

Не трогает fetch(url) без origin/referer во всех четырёх точках Циана (detail.py:130, serp.py:234, serp.py:359, newbuilding.py:271) — дефект №1 из #3251. На текущем режиме Циан не блокируется, так что чинить это стоит после того, как поднимется нагрузка: тогда и проверять будет на чём. Остаётся в #3284.

Закрывает #3284. ## Что не так У avito, domclick и yandex есть выделенный `*_detail_backfill`. У Циана его не было вообще: карточки доставались побочным эффектом `cian_history_backfill` — суточной задачи про историю цен, — а её выборка ключуется по `offer_price_history`, не по наличию карточки. Замер на 30.08: | источник | объявлений | с карточкой | доля | |---|---|---|---| | avito | 57 516 | 13 689 | 23.8% | | **cian** | **25 222** | **4 494** | **17.8%** | | yandex | 21 653 | 10 729 | 49.5% | | domklik | 8 412 | 6 411 | 76.2% | Циан — второй по объёму и последний по полноте. Без истории цен 19 046 объявлений при квоте `batch_size=100` в сутки: **190 дней** на текущий остаток, притом что Циан приносит ~4 900 объявлений за двое суток — очередь растёт примерно вдвадцатеро быстрее, чем разбирается. И отдельно: **1 697 объявлений имеют историю цен, но не имеют карточки.** Раз выборка ключуется по истории, для неё они уже обработаны и не вернутся никогда. **При этом фетчер исправен.** Прогоны 5154 / 5240 / 5328 — 100/100, 99/100, 100/100, остановка ровно на `batch_size`, а не по блокам, бюджету или окну. Чинить нечего: не выдана мощность. ## Правка Второй режим выборки и второе расписание **поверх того же тела** — машинерия работает, дублировать её новым модулем незачем. - `listings_pending="detail"` — выборка по `detail_enriched_at IS NULL`, свежие первыми (`ORDER BY last_seen_at DESC`). Очередь заведомо длиннее батча, поэтому порядок решает, что успеем добрать, а по свежим считается оценка. - Историческая выборка оставлена **побайтово**, включая отсутствие сортировки: по ней живёт суточный прогон, и менять её правкой про карточки нельзя. - Неизвестное значение — `ValueError`, а не молчаливый откат на дефолт. Опечатка в `default_params` иначе дала бы прогон с нулём добранных карточек, выглядящий штатно: очередь якобы пуста. - `do_houses=false` у нового расписания: дома разбирает суточный сосед. **Окно 0–23**, как у `avito_detail_backfill` и `yandex_detail_backfill`. Трёхчасовое здесь бессмысленно: прогон 5328 уложился в 54 минуты из трёх часов, две трети окна простаивали, а очередь росла. **`batch_size=400` — арифметика, не вкус.** Замеренный темп ~28 с на объявление; порог `reap_zombies` — 6 ч по `heartbeat_at`; бюджетного сторожа у `backfill_cian_history` нет, единственный ограничитель — размер батча. 400 × 28 с ≈ 3.1 ч проходит; 800, как у Яндекса, дало бы ≈6.2 ч и прогон убивало бы жнецом. **`enabled=false`**, как `domclick_detail_backfill` в миграции 175. Причина не в куках (гейт `_cian_pre_claim` общий с историей и проходит), а в нагрузке: это третий круглосуточный добор на общий пул из четырёх узлов. Включу отдельным шагом после деплоя и посмотрю на соседей. ## Тесты 13 проверок: ключ выборки, порядок, скоуп по источнику, неизменность прежнего режима, доезд `listings_pending` и `batch_size` до SQL, проводка параметров через посредника `_execute_cian_backfill`, регистрация обоих source и общий гейт кук. **Проверено мутациями** — каждая роняет свои тесты: | мутация | падает | |---|---| | снять `ORDER BY` в detail-выборке | 1 | | молчаливый дефолт вместо `ValueError` | 2 | | потерять `listings_pending` в посреднике | 2 | Набор целиком — `5196 passed, 37 skipped`. ## Чего эта правка НЕ делает Не трогает `fetch(url)` без `origin`/`referer` во всех четырёх точках Циана (`detail.py:130`, `serp.py:234`, `serp.py:359`, `newbuilding.py:271`) — дефект №1 из #3251. На текущем режиме Циан не блокируется, так что чинить это стоит после того, как поднимется нагрузка: тогда и проверять будет на чём. Остаётся в #3284.
lekss361 added 1 commit 2026-08-30 12:35:10 +00:00
feat(tradein/cian): у Циана не было добора карточек — только побочный эффект задачи про историю (#3284)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m2s
5f9dc5d512
Карточки Циана доставались побочным эффектом cian_history_backfill, а её
выборка ключуется по offer_price_history. Следствия на 30.08: карточка есть
у 4494 из 25222 объявлений (17.8% — последнее место при втором месте по
объёму), 19046 без истории при квоте 100/сутки (190 дней на остаток, тогда
как очередь растёт вдвадцатеро быстрее), и 1697 объявлений с историей и без
карточки, которые исторической выборке недостижимы в принципе.

Фетчер при этом исправен: прогоны 5154/5240/5328 дали 100/100, 99/100,
100/100. Чинить нечего — не выдана мощность.

Добавлен второй режим выборки (listings_pending="detail", по
detail_enriched_at, свежие первыми) и второе расписание поверх ТОГО ЖЕ тела:
машинерия работает, дублировать её новым модулем незачем. Историческая
выборка оставлена побайтово — по ней живёт суточный прогон.

batch_size=400 не на глаз: замеренный темп ~28с на объявление, порог
reap_zombies 6ч по heartbeat, бюджетного сторожа у задачи нет — 400×28с≈3.1ч
проходит, 800 как у Яндекса (≈6.2ч) убивало бы жнецом.

Расписание засеяно enabled=false, как domclick_detail_backfill в миграции
175: это третий круглосуточный добор на общий пул из четырёх узлов, влияние
на соседей надо посмотреть, а не предположить.

Тесты: 13 проверок, ключ выборки / порядок / неизменность прежнего режима /
проводка параметров через посредника / регистрация обоих source. Проверено
мутациями: снятие ORDER BY, молчаливый дефолт вместо ValueError и потеря
listings_pending в посреднике роняют по 2-3 теста каждая. Набор целиком —
5196 passed, 37 skipped.
lekss361 merged commit cb9dc1505a into main 2026-08-30 12:41:37 +00:00
lekss361 deleted branch feat/3284-cian-detail-backfill 2026-08-30 12:41:37 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3285
No description provided.