Переезд: скрапперы остаются на Beget — построчный upsert через сеть станет часами ожидания #3028

Closed
opened 2026-08-21 12:55:05 +00:00 by lekss361 · 1 comment
Owner

Эпик: #2989

Что меняется

По целевой топологии Postgres уезжает на выделенный сервер, а скрапинг остаётся на Beget. Сегодня скраппер и база — на одной машине, запись идёт через локальный сокет и стоимость round-trip близка к нулю. После переезда каждая операция записи станет междоузловой.

Почему это ломается

Запись сейчас построчная. При задержке 10–15 мс между Beget и Selectel СПб десятки тысяч объявлений за проход превращаются в часы чистого ожидания сети — при том, что сам сбор уже занимает 449 минут только по ЦИАН-Екатеринбургу.

Замер задержки не проводился — 10–15 мс это оценка по типовому Москва↔СПб. Мерить обязательно до окна, см. отдельную задачу.

Что сделать

  • Перевести горячие пути записи на пакетный upsert (execute_values / COPY во временную таблицу + INSERT … SELECT … ON CONFLICT), размер пачки подобрать замером, не на глаз.
  • Пулинг соединений вместо коннекта на операцию.
  • TLS обязателен — трафик пойдёт через интернет и несёт ПДн. Проверить, что sslmode не disable и не prefer, а require/verify-full.
  • Пересмотреть таймауты: значения, выставленные под локальный сокет, на междоузловом соединении дадут ложные отказы.

Связь с #2992

Гейт IS DISTINCT FROM в апсерте уже влит и резко сократил число реальных записей. Это уменьшает объём проблемы, но не снимает: пакетность нужна для тех строк, которые реально меняются, а их всё равно тысячи за проход.

Делать логично одним заходом — правки в тех же местах.

Приёмка

  • Горячие пути записи пакетные, размер пачки обоснован замером
  • Пулинг соединений
  • sslmode=require минимум, сертификат проверяется
  • Таймауты пересмотрены под сетевую задержку
  • Замер: время полного прохода ЦИАН до и после, на реальной задержке
Эпик: #2989 ## Что меняется По целевой топологии Postgres уезжает на выделенный сервер, а **скрапинг остаётся на Beget**. Сегодня скраппер и база — на одной машине, запись идёт через локальный сокет и стоимость round-trip близка к нулю. После переезда каждая операция записи станет междоузловой. ## Почему это ломается Запись сейчас **построчная**. При задержке 10–15 мс между Beget и Selectel СПб десятки тысяч объявлений за проход превращаются в часы чистого ожидания сети — при том, что сам сбор уже занимает 449 минут только по ЦИАН-Екатеринбургу. Замер задержки **не проводился** — 10–15 мс это оценка по типовому Москва↔СПб. Мерить обязательно до окна, см. отдельную задачу. ## Что сделать - Перевести горячие пути записи на **пакетный upsert** (`execute_values` / `COPY` во временную таблицу + `INSERT … SELECT … ON CONFLICT`), размер пачки подобрать замером, не на глаз. - Пулинг соединений вместо коннекта на операцию. - **TLS обязателен** — трафик пойдёт через интернет и несёт ПДн. Проверить, что `sslmode` не `disable` и не `prefer`, а `require`/`verify-full`. - Пересмотреть таймауты: значения, выставленные под локальный сокет, на междоузловом соединении дадут ложные отказы. ## Связь с #2992 Гейт `IS DISTINCT FROM` в апсерте уже влит и резко сократил число реальных записей. Это **уменьшает** объём проблемы, но не снимает: пакетность нужна для тех строк, которые реально меняются, а их всё равно тысячи за проход. Делать логично одним заходом — правки в тех же местах. ## Приёмка - [ ] Горячие пути записи пакетные, размер пачки обоснован замером - [ ] Пулинг соединений - [ ] `sslmode=require` минимум, сертификат проверяется - [ ] Таймауты пересмотрены под сетевую задержку - [ ] Замер: время полного прохода ЦИАН до и после, на реальной задержке
lekss361 added the
bug
priority/p1
scope/backend
scrapers
tradein
labels 2026-08-21 12:57:07 +00:00
Author
Owner

Закрывается как неактуальная — решение владельца 2026-08-23

Задача существовала только потому, что по решению от 20.08 скрапперы оставались на Beget, а базы уезжали на Selectel — запись становилась междоузловой, и построчный upsert через сеть превращался в часы.

Владелец решил 23.08: скрапперы едут на Selectel вместе с базами. Запись в БД остаётся локальной, междоузлового upsert не возникает. Требования этой задачи — пакетная запись, TLS, пулинг — отпадают целиком.

Что подтолкнуло к смене решения

Замер задержки Beget ↔ Selectel СПб 2026-08-22: 17.1 / 24.9 / 32.7 мс (avg 24.9, потерь 0) против проектной оценки 10–15 мс. То есть цена «оставить ферму на Beget» оказалась вдвое выше расчётной, на которой строилась исходная постановка.

Расхождение было заметно ещё 22.08: в комментарии к #3031 («Сетевое разделение на новом хосте») таблица раскладки помещала «скраперы, браузер» в docker-сеть приложений НА новом хосте, что прямо противоречило этой задаче. Владелец подтвердил, что верна таблица.

Следствия для других задач

  • #3030 резко упрощается: на Beget остаются только Forgejo, CI-раннеры, GlitchTip, CouchDB. Резерв 3 ГБ / 2–3 ядра под ферму оттуда уходит.
  • #3031 — требование в силе и становится строже: скраперы и браузер должны жить в отдельной docker-сети без доступа к сети данных. Хост несёт ПДн, а браузерный скрапинг — типовая точка входа.
  • #2996 / #3053 — FDW tradein → gendesign тем более остаётся локальным.

Запись в волте: decisions/Decision_Scrapers_Move_To_Selectel_Aug23.md; пункт про скрапперов в Decision_Target_Topology_Migration_Aug20.md помечен как отменённый.

Refs #2989

## Закрывается как неактуальная — решение владельца 2026-08-23 Задача существовала только потому, что по решению от 20.08 скрапперы оставались на Beget, а базы уезжали на Selectel — запись становилась междоузловой, и построчный upsert через сеть превращался в часы. **Владелец решил 23.08: скрапперы едут на Selectel вместе с базами.** Запись в БД остаётся локальной, междоузлового upsert не возникает. Требования этой задачи — пакетная запись, TLS, пулинг — отпадают целиком. ### Что подтолкнуло к смене решения Замер задержки Beget ↔ Selectel СПб 2026-08-22: **17.1 / 24.9 / 32.7 мс** (avg 24.9, потерь 0) против проектной оценки 10–15 мс. То есть цена «оставить ферму на Beget» оказалась вдвое выше расчётной, на которой строилась исходная постановка. Расхождение было заметно ещё 22.08: в комментарии к #3031 («Сетевое разделение на новом хосте») таблица раскладки помещала «скраперы, браузер» в docker-сеть приложений НА новом хосте, что прямо противоречило этой задаче. Владелец подтвердил, что верна таблица. ### Следствия для других задач - **#3030** резко упрощается: на Beget остаются только Forgejo, CI-раннеры, GlitchTip, CouchDB. Резерв 3 ГБ / 2–3 ядра под ферму оттуда уходит. - **#3031** — требование в силе и становится строже: скраперы и браузер должны жить в **отдельной docker-сети без доступа к сети данных**. Хост несёт ПДн, а браузерный скрапинг — типовая точка входа. - **#2996 / #3053** — FDW `tradein → gendesign` тем более остаётся локальным. Запись в волте: `decisions/Decision_Scrapers_Move_To_Selectel_Aug23.md`; пункт про скрапперов в `Decision_Target_Topology_Migration_Aug20.md` помечен как отменённый. Refs #2989
Sign in to join this conversation.
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#3028
No description provided.