Использование ключей маршрутизации и аренды профилей в очередях воркеров Playwright

Ошибка Playwright вроде TimeoutError: page.click failed — это зачастую ложь.

Ошибка говорит вам о том, что увидел скрипт. Она не говорит о том, почему скрипт изначально оказался не в том месте.

Однажды я видел, как два воркера взяли задачи для одного и того же аккаунта. Оба воркера одновременно открыли один и тот же профиль браузера. Один воркер ждал загрузки медленной страницы. Другой воркер сделал повторную попытку, изменил состояние сессии и вызвал сбой.

Проблема была не в коде. Проблема была в очереди.

Большинство очередей воркеров рассчитаны на стейтлесс-задачи (stateless jobs):

  • Взять задачу.
  • Найти свободного воркера.
  • Выполнить задачу.
  • Отметить как выполненную.

Это работает для скриншотов или API-вызовов. Это не работает для автоматизации браузера.

Профиль браузера не является стейтлесс. Он принадлежит одному аккаунту, одному прокси и одному состоянию сессии. Самый быстрый воркер — не всегда подходящий воркер.

Чтобы масштабироваться безопасно, вы должны изменить свою логику.

Вместо того чтобы спрашивать: «Какой воркер свободен?»

Спрашивайте: «Какая среда аккаунта сейчас безопасна для использования?»

Вы можете решить это с помощью трех уровней:

  1. Routing Keys (Ключи маршрутизации) Не позволяйте любому воркеру хватать любую задачу. Используйте ключ маршрутизации на основе ID профиля или ID аккаунта. Это гарантирует, что только один воркер работает с конкретным профилем в данный момент.

  2. Profile Leases (Аренда профилей) Запрос в очереди означает, что воркер владеет задачей. Аренда профиля (profile lease) означает, что воркеру разрешено использовать конкретный профиль браузера в течение определенного времени. Используйте аренду с механизмом heartbeat. Если задача занимает больше времени, чем ожидалось, воркер должен продлить аренду.

  3. Fencing Tokens (Токены ограждения) Устаревшие воркеры опасны. Если воркер теряет аренду из-за сетевой задержки, но продолжает работать, он может попытаться записать данные. Используйте fencing token. Слой хранения должен отклонять любые записи от старого токена.

Вы также должны добавить шлюз готовности (readiness gate). Перед запуском Playwright проверьте следующее:

  • Не приостановлен ли аккаунт?
  • Требуется ли профилю проверки человеком?
  • Соответствует ли регион прокси требованиям задачи?

Заблокированная задача — это не всегда проваленная задача. Часто это просто задача, ожидающая подходящего контекста.

Перестаньте строить очереди, которые приоритезируют только скорость. Стройте очереди, которые приоритезируют состояние аккаунта.

Source: https://dev.to/web4browser/using-routing-keys-and-profile-leases-in-playwright-worker-queues-a53