Playwright 워커 큐에서 라우팅 키와 프로필 리스 사용하기
TimeoutError: page.click failed와 같은 Playwright 에러는 종종 거짓말입니다.
에러는 스크립트가 무엇을 보았는지만 알려줍니다. 왜 스크립트가 애초에 잘못된 위치에 있었는지는 알려주지 않습니다.
한 번은 두 개의 워커가 동일한 계정에 대한 작업을 가져가는 것을 본 적이 있습니다. 두 워커 모두 동시에 동일한 브라우저 프로필을 열었습니다. 한 워커는 느린 페이지를 기다리고 있었습니다. 다른 워커는 재시도하며 세션 상태를 변경했고, 이로 인해 실패가 발생했습니다.
문제는 코드가 아니었습니다. 문제는 큐(queue)였습니다.
대부분의 워커 큐는 상태 비저장(stateless) 작업에 맞게 설계되어 있습니다.
- 작업을 가져옵니다.
- 빈 워커를 찾습니다.
- 작업을 실행합니다.
- 완료로 표시합니다.
이 방식은 스크린샷이나 API 호출에는 적합합니다. 하지만 브라우저 자동화에는 실패합니다.
브라우저 프로필은 상태 비저장이 아닙니다. 하나의 계정, 하나의 프록시, 그리고 하나의 세션 상태에 속합니다. 가장 빠른 워커가 항상 적절한 워커는 아닙니다.
안전하게 확장하려면 로직을 전환해야 합니다.
"어떤 워커가 비어 있는가?"라고 묻는 대신,
"지금 어떤 계정 환경을 사용하는 것이 안전한가?"라고 물어야 합니다.
세 가지 계층으로 이를 해결할 수 있습니다.
1. 라우팅 키 (Routing Keys)
어떤 워커도 아무 작업이나 가져가게 두지 마십시오. 프로필 ID 또는 계정 ID를 기반으로 한 라우팅 키를 사용하십시오. 이를 통해 한 번에 하나의 워커만 특정 프로필을 다루도록 보장할 수 있습니다.
2. 프로필 리스 (Profile Leases)
큐 점유(queue claim)는 워커가 작업을 소유함을 의미합니다. 프로필 리스는 워커가 정해진 시간 동안 특정 브라우저 프로필을 사용할 수 있음을 의미합니다. 하트비트(heartbeat)가 포함된 리스를 사용하십시오. 작업이 예상보다 오래 걸리면 워커는 리스를 갱신해야 합니다.
3. 펜싱 토큰 (Fencing Tokens)
만료된(stale) 워커는 위험합니다. 네트워크 지연으로 인해 워커가 리스를 잃었음에도 계속 실행된다면, 데이터를 쓰려고 시도할 수 있습니다. 펜싱 토큰을 사용하십시오. 스토리지 계층은 오래된 토큰으로부터 오는 모든 쓰기 작업을 거부해야 합니다.
또한 준비 게이트(readiness gate)를 추가해야 합니다. Playwright를 실행하기 전에 다음 사항을 확인하십시오:
- 계정이 일시 중지되었는가?
- 프로필에 사람의 검토가 필요한가?
- 프록시 지역이 작업 요구 사항과 일치하는가?
차단된 작업이 항상 실패한 작업은 아닙니다. 종종 적절한 컨텍스트를 기다리고 있는 작업일 뿐입니다.
속도만을 우선시하는 큐를 만드는 것을 멈추십시오. 계정 상태를 우선시하는 큐를 만드십시오.
Source: https://dev.to/web4browser/using-routing-keys-and-profile-leases-in-playwright-worker-queues-a53
