Wykorzystanie kluczy routingu i dzierżaw profili w kolejkach workerów Playwright
Błąd Playwright, taki jak TimeoutError: page.click failed, często jest kłamstwem.
Błąd informuje Cię o tym, co zobaczył skrypt. Nie mówi jednak o tym, dlaczego skrypt znalazł się w niewłaściwym miejscu.
Widziałem kiedyś, jak dwóch workerów pobrało zadania dla tego samego konta. Obaj otworzyli ten sam profil przeglądarki w tym samym czasie. Jeden worker czekał na wolno ładującą się stronę. Drugi spróbował ponownie, zmienił stan sesji i spowodował błąd.
Problemem nie był kod. Problemem była kolejka.
Większość kolejek workerów jest zaprojektowana dla zadań bezstanowych (stateless).
- Pobierz zadanie.
- Znajdź wolnego workera.
- Wykonaj zadanie.
- Oznacz jako wykonane.
To działa w przypadku zrzutów ekranu lub wywołań API. Zawodzi jednak w przypadku automatyzacji przeglądarki.
Profil przeglądarki nie jest bezstanowy. Należy do jednego konta, jednego proxy i jednego stanu sesji. Najszybszy worker nie zawsze jest właściwym workerem.
Aby skalować bezpiecznie, musisz zmienić logikę.
Zamiast pytać: Który worker jest wolny?
Zapytaj: Które środowisko konta jest teraz bezpieczne do użycia?
Możesz to rozwiązać za pomocą trzech warstw:
Klucze routingu (Routing Keys) Nie pozwól, aby dowolny worker pobierał dowolne zadanie. Użyj klucza routingu opartego na ID profilu lub ID konta. Zapewni to, że tylko jeden worker będzie operował na konkretnym profilu w danym czasie.
Dzierżawy profili (Profile Leases) Przejęcie zadania z kolejki oznacza, że worker posiada zadanie. Dzierżawa profilu oznacza, że worker ma pozwolenie na korzystanie z konkretnego profilu przeglądarki przez określony czas. Użyj dzierżawy z mechanizmem heartbeat. Jeśli zadanie zajmuje więcej czasu niż oczekiwano, worker musi odnowić dzierżawę.
Tokeny odgradzające (Fencing Tokens) Nieaktualne workery są niebezpieczne. Jeśli worker straci dzierżawę z powodu opóźnienia sieciowego, ale nadal będzie działał, może spróbować zapisać dane. Użyj tokena odgradzającego (fencing token). Warstwa składowania powinna odrzucać wszelkie zapisy pochodzące ze starego tokena.
Musisz również dodać bramkę gotowości (readiness gate). Zanim uruchomisz Playwright, sprawdź:
- Czy konto jest wstrzymane?
- Czy profil wymaga weryfikacji przez człowieka?
- Czy region proxy zgadza się z wymaganiami zadania?
Zablokowane zadanie nie zawsze jest zadaniem nieudanym. Często jest to po prostu zadanie czekające na odpowiedni kontekst.
Przestań budować kolejki, które priorytetyzują jedynie szybkość. Buduj kolejki, które priorytetyzują stan konta.
Źródło: https://dev.to/web4browser/using-routing-keys-and-profile-leases-in-playwright-worker-queues-a53
