Using Routing Keys and Profile Leases in Playwright Worker Queues
Một lỗi Playwright như TimeoutError: page.click failed thường là một sự lừa dối.
Lỗi đó cho bạn biết những gì script đã thấy. Nó không cho bạn biết tại sao ngay từ đầu script đã ở sai vị trí.
Tôi đã từng thấy hai worker cùng nhận các công việc cho cùng một tài khoản. Cả hai worker đều mở cùng một browser profile tại cùng một thời điểm. Một worker đang chờ một trang web tải chậm. Worker còn lại thực hiện thử lại, thay đổi trạng thái phiên (session state) và gây ra lỗi.
Vấn đề không nằm ở mã nguồn. Vấn đề nằm ở hàng đợi (queue).
Hầu hết các worker queue được thiết kế cho các công việc không lưu trạng thái (stateless jobs).
- Nhận một job.
- Tìm một worker đang rảnh.
- Chạy tác vụ.
- Đánh dấu hoàn thành.
Cách này hoạt động tốt với ảnh chụp màn hình hoặc các lệnh gọi API. Nhưng nó thất bại đối với tự động hóa trình duyệt (browser automation).
Một browser profile không phải là stateless. Nó thuộc về một tài khoản, một proxy và một session state nhất định. Worker nhanh nhất không phải lúc nào cũng là worker phù hợp nhất.
Để mở rộng (scale) một cách an toàn, bạn phải thay đổi logic của mình.
Thay vì hỏi: Worker nào đang rảnh?
Hãy hỏi: Môi trường tài khoản nào hiện tại an toàn để sử dụng?
Bạn có thể giải quyết vấn đề này với ba lớp:
Routing Keys Đừng để bất kỳ worker nào cũng có thể lấy bất kỳ job nào. Hãy sử dụng một routing key dựa trên profile ID hoặc account ID. Điều này đảm bảo chỉ có một worker chạm vào một profile cụ thể tại một thời điểm.
Profile Leases Một queue claim có nghĩa là một worker sở hữu một job. Một profile lease có nghĩa là một worker được phép sử dụng một browser profile cụ thể trong một khoảng thời gian nhất định. Hãy sử dụng lease kèm theo heartbeat. Nếu tác vụ mất nhiều thời gian hơn dự kiến, worker phải gia hạn lease đó.
Fencing Tokens Các worker bị lỗi thời (stale workers) rất nguy hiểm. Nếu một worker bị mất lease do trễ mạng nhưng vẫn tiếp tục chạy, nó có thể cố gắng ghi dữ liệu. Hãy sử dụng fencing token. Lớp lưu trữ (storage layer) nên từ chối bất kỳ lệnh ghi nào từ một token cũ.
Bạn cũng phải thêm một readiness gate. Trước khi bạn khởi chạy Playwright, hãy kiểm tra các điều sau:
- Tài khoản có đang bị tạm dừng không?
- Profile có cần con người kiểm tra không?
- Khu vực proxy có khớp với yêu cầu của job không?
Một job bị chặn không phải lúc nào cũng là một job thất bại. Nó thường chỉ là một job đang chờ đợi ngữ cảnh (context) phù hợp.
Hãy ngừng xây dựng các hàng đợi chỉ ưu tiên tốc độ. Hãy xây dựng các hàng đợi ưu tiên trạng thái tài khoản (account state).
Nguồn: https://dev.to/web4browser/using-routing-keys-and-profile-leases-in-playwright-worker-queues-a53
