การใช้ Routing Keys และ Profile Leases ใน Playwright Worker Queues
ข้อผิดพลาดของ Playwright อย่าง TimeoutError: page.click failed มักจะเป็นเรื่องโกหก
ข้อผิดพลาดนี้บอกคุณว่าสคริปต์เห็นอะไร แต่มันไม่ได้บอกว่าทำไมตั้งแต่แรกสคริปต์ถึงไปอยู่ในตำแหน่งที่ผิด
ผมเคยเห็น worker สองตัวหยิบงานของบัญชีเดียวกันขึ้นมาทำ ทั้งคู่เปิด browser profile เดียวกันในเวลาเดียวกัน Worker ตัวหนึ่งกำลังรอหน้าเว็บที่โหลดช้า ส่วนอีกตัวพยายามทำซ้ำ เปลี่ยนสถานะเซสชัน (session state) และทำให้เกิดความล้มเหลว
ปัญหาไม่ได้อยู่ที่โค้ด แต่มันอยู่ที่คิว (queue)
คิวของ worker ส่วนใหญ่ถูกออกแบบมาสำหรับงานแบบ stateless (ไม่มีสถานะ)
- หยิบงาน
- หา worker ที่ว่าง
- รันงาน
- ทำเครื่องหมายว่าเสร็จสิ้น
วิธีนี้ใช้ได้กับการถ่ายภาพหน้าจอหรือการเรียก API แต่ใช้ไม่ได้กับการทำ browser automation
Browser profile ไม่ใช่แบบ stateless มันผูกติดกับหนึ่งบัญชี, หนึ่ง proxy และหนึ่ง session state worker ที่เร็วที่สุดอาจไม่ใช่ worker ที่เหมาะสมที่สุดเสมอไป
เพื่อการขยายระบบ (scale) อย่างปลอดภัย คุณต้องเปลี่ยนตรรกะ (logic) ของคุณ
แทนที่จะถามว่า: Which worker is free? (worker ตัวไหนว่าง?)
ให้ถามว่า: Which account environment is safe to use now? (สภาพแวดล้อมของบัญชีไหนที่ปลอดภัยที่จะใช้งานในตอนนี้?)
คุณสามารถแก้ปัญหานี้ได้ด้วยสามเลเยอร์:
Routing Keys อย่าปล่อยให้ worker ตัวไหนก็ได้หยิบงานอะไรก็ได้ไป ให้ใช้ routing key ที่อ้างอิงจาก profile ID หรือ account ID วิธีนี้จะช่วยให้มั่นใจว่าจะมี worker เพียงตัวเดียวเท่านั้นที่เข้าถึง profile เฉพาะเจาะจงได้ในเวลาเดียวกัน
Profile Leases การเคลมคิว (queue claim) หมายถึง worker เป็นเจ้าของงานนั้นๆ แต่ profile lease หมายถึง worker ได้รับอนุญาตให้ใช้ browser profile เฉพาะเจาะจงในช่วงเวลาที่กำหนด ให้ใช้ lease ร่วมกับ heartbeat หากงานใช้เวลานานกว่าที่คาดไว้ worker จะต้องทำการต่ออายุ lease
Fencing Tokens worker ที่ค้างอยู่ (stale workers) นั้นอันตราย หาก worker สูญเสีย lease ไปเนื่องจากเครือข่ายล่าช้าแต่ยังคงทำงานต่อไป มันอาจพยายามเขียนข้อมูล ให้ใช้ fencing token โดยที่ชั้นการจัดเก็บข้อมูล (storage layer) ควรปฏิเสธการเขียนข้อมูลใดๆ ที่มาจาก token เก่า
คุณต้องเพิ่ม readiness gate ด้วย ก่อนที่จะเริ่มรัน Playwright ให้ตรวจสอบสิ่งเหล่านี้:
- บัญชีถูกระงับอยู่หรือไม่?
- profile จำเป็นต้องได้รับการตรวจสอบโดยมนุษย์หรือไม่?
- ภูมิภาคของ proxy ตรงกับความต้องการของงานหรือไม่?
งานที่ถูกบล็อกไม่ได้หมายความว่าเป็นงานที่ล้มเหลวเสมอไป บ่อยครั้งมันเป็นเพียงงานที่กำลังรอบริบท (context) ที่เหมาะสม
หยุดสร้างคิวที่ให้ความสำคัญกับความเร็วเพียงอย่างเดียว แต่จงสร้างคิวที่ให้ความสำคัญกับสถานะของบัญชี (account state)
Source: https://dev.to/web4browser/using-routing-keys-and-profile-leases-in-playwright-worker-queues-a53
