استفاده از Routing Keys و Profile Leases در صف‌های کاری Playwright

یک خطای Playwright مانند TimeoutError: page.click failed اغلب یک دروغ است.

این خطا به شما می‌گوید که اسکریپت چه چیزی را مشاهده کرده است، اما به شما نمی‌گوید که چرا اسکریپت از همان ابتدا در جای اشتباهی قرار داشته است.

من یک بار دیدم که دو ورکر (worker) وظایفی را برای یک حساب کاربری یکسان برداشته‌اند. هر دو ورکر همزمان یک پروفایل مرورگر مشابه را باز کردند. یکی از ورکرها منتظر یک صفحه کند بود، در حالی که ورکر دیگر تلاش مجدد کرد، وضعیت نشست (session state) را تغییر داد و باعث بروز خطا شد.

مشکل از کد نبود؛ مشکل از صف (queue) بود.

اکثر صف‌های کاری برای وظایف بدون وضعیت (stateless) طراحی شده‌اند:

  • یک وظیفه را بردارید.
  • یک ورکر آزاد پیدا کنید.
  • وظیفه را اجرا کنید.
  • آن را به عنوان انجام‌شده علامت بزنید.

این روش برای اسکرین‌شات‌ها یا فراخوانی‌های API جواب می‌دهد، اما برای اتوماسیون مرورگر شکست می‌خورد.

یک پروفایل مرورگر بدون وضعیت نیست. این پروفایل متعلق به یک حساب کاربری، یک پروکسی و یک وضعیت نشست مشخص است. سریع‌ترین ورکر همیشه ورکر مناسب نیست.

برای مقیاس‌پذیری ایمن، باید منطق خود را تغییر دهید.

به جای اینکه بپرسید: کدام ورکر آزاد است؟

بپرسید: کدام محیط حساب کاربری اکنون برای استفاده ایمن است؟

شما می‌توانید این مشکل را با سه لایه حل کنید:

  1. Routing Keys (کلیدهای مسیریابی) اجازه ندهید هر ورکری هر وظیفه‌ای را بردارد. از یک routing key بر اساس profile ID یا account ID استفاده کنید. این کار تضمین می‌کند که در هر لحظه فقط یک ورکر با یک پروفایل خاص درگیر شود.

  2. Profile Leases (اجاره پروفایل) تصاحب یک وظیفه در صف به این معناست که یک ورکر مالک آن وظیفه است، اما یک profile lease به این معناست که یک ورکر اجازه دارد برای مدتی مشخص از یک پروفایل مرورگر خاص استفاده کند. از یک lease به همراه heartbeat استفاده کنید. اگر انجام وظیفه بیش از حد انتظار طول کشید، ورکر باید اجاره را تمدید کند.

  3. Fencing Tokens (توکن‌های حصار) ورکرهای قدیمی (stale) خطرناک هستند. اگر ورکری به دلیل تأخیر شبکه، اجاره (lease) خود را از دست بدهد اما همچنان به کار خود ادامه دهد، ممکن است سعی کند داده‌ای بنویسد. از یک fencing token استفاده کنید. لایه ذخیره‌سازی باید هرگونه نوشتن از طریق یک توکن قدیمی را رد کند.

همچنین باید یک دروازه آمادگی (readiness gate) اضافه کنید. قبل از اجرای Playwright، این موارد را بررسی کنید:

  • آیا حساب کاربری متوقف شده است؟
  • آیا پروفایل نیاز به بررسی انسانی دارد؟
  • آیا منطقه پروکسی با الزامات وظیفه مطابقت دارد؟

یک وظیفه مسدود شده همیشه به معنای یک وظیفه شکست‌خورده نیست؛ اغلب فقط وظیفه‌ای است که منتظر زمینه (context) مناسب است.

از ساختن صف‌هایی که فقط سرعت را در اولویت قرار می‌دهند دست بردارید. صف‌هایی بسازید که وضعیت حساب کاربری را در اولویت قرار می‌دهند.

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