fix(tradein/proxy): учитывать историю банов при выборе egress-узла #2877

Merged
lekss361 merged 1 commit from fix/tradein-proxy-rank into main 2026-08-13 17:47:03 +00:00

1 commit

Author SHA1 Message Date
bot-backend
bd9c2d50bd fix(tradein/proxy): учитывать историю банов при выборе egress-узла
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 11s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
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 / backend-tests (pull_request) Successful in 4m36s
Замер на проде 2026-08-13: резолвер выбирал asocks-residential-1, который
отдаёт 403 и на Авито, и на Циане, при трёх рабочих мобильных узлах (Циан
через них — 200).

Причина: ранжирование шло по consecutive_fails, затем по свежести
last_ok_at. У всех узлов ноль сбоев, поэтому решала свежесть healthcheck'а,
а он проверяет доступность самого прокси, а не то, пускает ли через него
площадка. Узел одновременно «здоров» и заблокирован. Как только истекал
TTL бана, он снова становился первым кандидатом — при ban_count=17 по Циану.

- В ранжирование добавлен ban_count по этому источнику: NOT EXISTS заменён
  на LEFT JOIN, истёкшие строки банов больше не теряются, а работают как
  история. Порядок: сначала узлы без истории, дальше по возрастанию
  ban_count, при равенстве — прежний tie-break.
- Активный бан по-прежнему исключает узел полностью, семантика не менялась.
- В лог выбора добавлен ban_count — чтобы было видно, что узел с историей
  выбран осознанно. Полный URL с credentials по-прежнему не логируется.

На проде это ставит residential-1 последним для Авито (5 банов против 0 у
mobile-2/3) вместо первого.
2026-08-13 20:37:42 +03:00