ترفند PostHog برای اینکه هوش مصنوعی بتونه ضبط صفحه رو ببینه
خلاصهٔ کاملتر
خیلی از ضبطهای session replay (که رفتار کاربر رو تو صفحه ضبط میکنن) هیچوقت دیده نمیشن، چون هر روز دهها هزار تاش جمع میشه و آدم وقت نداره همه رو تماشا کنه. تیم PostHog میخواست این کارو بسپاره به مدلهای چندوجهی هوش مصنوعی مثل Gemini، اما یه مشکل اساسی داشتن: این ضبطها اصلاً ویدیو نیستن. کتابخونهی rrweb که PostHog استفاده میکنه، فقط یه عکس اولیه از DOM (ساختار درختی صفحه) میگیره و بعد یه سری رویداد مثل «این المان اضافه شد» یا «موس به این مختصات رفت» رو ذخیره میکنه.
دادن این دادهی خام به مدل زبانی جواب نداد؛ هم حجمش زیاده و از پنجرهی زمینه (context window) مدل بیرون میزنه، هم مدل واقعاً نمیفهمه صفحه چه شکلیه، چون باید کل درخت رو تو ذهنش بسازه و layout (چیدمان نهایی المانها روی صفحه) رو حساب کنه. برای همین PostHog یه «رستریساز» (rasterizer) ساخت: سرویسی که ضبط rrweb رو تو یه مرورگر هدلس (بدون رابط گرافیکی) پخش میکنه و همونطور که پخش میشه، فریمبهفریم ازش فیلم میگیره و با ffmpeg تبدیلش میکنه به یه فایل MP4 واقعی.
وقتی این سرویس رو تکنمونه اجرا میکردن مشکلی نبود، ولی وقتی چند نمونهش رو همزمان رو یه سرور اجرا کردن، ویدیوها یا جایی از ضبط رو رد میکردن یا چند ثانیه فریز میشدن. علتش این بود که دو پردازش مجزا (یکی رندر صفحه، یکی گرفتن فریم) هر کدوم به ساعت واقعی سیستم وابسته بودن؛ اگه یکی بهخاطر کمبود CPU عقب میافتاد، اون یکی سرجای خودش میماند و نتیجه، فریم تکراری (فریز) یا فریم گمشده (رد شدن) بود.
راهحل PostHog، هماهنگ کردن این دو پردازش با فریز کردن زمان بود. با یه قابلیت کروم به اسم HeadlessExperimental.beginFrame، رندر مرورگر متوقف میمونه تا صریحاً بهش دستور بدن «یه فریم دیگه بساز». همزمان، توابع زمانسنجی جاوااسکریپت مثل Date.now و requestAnimationFrame رو داخل صفحه بازنویسی کردن تا پلیر ضبط فکر کنه زمان هنوز با سرعت عادی میگذره، در حالی که واقعاً فقط با هر دستور beginFrame یهقدم جلو میره. این کارو با یه کتابخونهی آماده به اسم puppeteer-capture انجام دادن.
نتیجه این شد که فریز و رد شدن فریم کاملاً از بین رفت، چون رندر و ضبط دیگه به ساعت واقعی وابسته نبودن و همیشه دقیقاً منتظر هم میمونن. این رستریساز از مارس ۲۰۲۶ رو محیط عملیاتی PostHog فعاله و تا امروز بیش از ۳۷۰ سال از ضبطها رو تبدیل به حدود ۳.۵ میلیون ویدیو کرده.
نکات کلیدی:
- ضبطهای session replay تو PostHog با rrweb ذخیره میشن، نه به شکل ویدیوی واقعی؛ برای همین مدلهای هوش مصنوعی نمیتونن مستقیم ببینشونش.
- مشکل اصلی، ناهماهنگی دو پردازش رندر و ضبط فریم زیر بار CPU بود که باعث فریز یا رد شدن بخشهایی از ویدیو میشد.
- راهحل، استفاده از HeadlessExperimental.beginFrame کروم بههمراه فریز کردن ساعت جاوااسکریپت صفحه بود.
- این رستریساز از مارس ۲۰۲۶ فعاله و بیش از ۳۷۰ سال ضبط رو به ۳.۵ میلیون ویدیو تبدیل کرده.




