اتوکامپلیت با تاخیر نزدیک صفر برای ۲۴۰ میلیون دامنه
خلاصهٔ کاملتر
نویسنده که سایت Wirewiki.com رو برای بررسی زیرساخت اینترنتی (رکوردهای DNS، دلگیشن، تنظیمات ایمیل و غیره) اداره میکنه، میگه چون رقبای زیادی تو همین حوزه هستن، تصمیم گرفته روی کیفیت ابزار و تجربه کاربری تمرکز کنه. چون اتوکامپلیت مسیر اصلی ناوبری تو سایتشه، هدفش این بوده که این قابلیت «همین لحظهای» حس بشه، نه فقط سریع.
راهکارش دو بخشه: سمت مرورگر، موقع keyDown (لحظه فشردن کلید) پیشنهادها رو برای کاراکتر تایپشده و حالتهای بعدی پیشواکشی و کش میکنه، و موقع keyUp (لحظه رها کردن کلید) نتیجه رو نمایش میده. این یعنی بودجه زمانی API برابر میشه با کل مدت زمان بین فشردن و رها کردن دو کلید پشت سر هم؛ نویسنده با اندازهگیری واقعی این عدد رو حدود ۱۲۱ میلیثانیه (در صدک ۹۹ام) به دست آورده.
سمت سرور، منبع داده ترکیبیه: لیست Tranco (یک میلیون دامنه پرترافیک) بهعنوان بخش «سر»، و لیست CZDS (همه دامنههای gTLD مثل com. و org.) بهعنوان بخش «دم». بخش سر با یه trie (درخت پیشوندی) تو حافظه پیادهسازی شده که پیشنهادهای هر پیشوند از قبل توش محاسبه شده؛ جستجو فقط طی کردن چند اشارهگره. بخش دم که حدود ۲۴۰ میلیون دامنه و ۲.۵ گیگابایت فضا رو شامل میشه، بهصورت بلاکهای فشرده روی SSD نگهداری میشه و با یه دایرکتوری کوچیک تو حافظه (۲۷ مگابایت) جستجوی دودویی میشه.
برای تست، نویسنده با کمک یه LLM یه تست بار تولید کرده: شبیهسازی ۶۰ هزار دامنه تایپشده که در مجموع ۷۲۰ هزار کوئری کلیدواره ساخته و روی سرور واقعی، هم مستقیم روی API و هم پشت Nginx، اجرا شده. نتیجه این بوده که اکثر درخواستها زیر ۲ میلیثانیه جواب میگیرن و حتی تو نرخ ۱۶۰۰ درخواست بر ثانیه، ترکیب Nginx و API تو صدک ۹۹ام هم زیر ۱۵ میلیثانیه جواب میده.
نویسنده میگه دیگه بهینهسازی بیشتر API فایده چندانی نداره، چون تاخیر شبکه عامل غالب شده؛ در عمل تاخیر کلی اتوکامپلیت تقریباً برابره با رفتوبرگشت از مرورگر تا سرور از مسیر Cloudflare بهعلاوه ده میلیثانیه. چون فعلاً فقط یه سرور تو اروپا داره، ترافیک از فاصله دور مثل آمریکا ممکنه صد تا دویست میلیثانیه اضافه تاخیر بگیره و از بودجه صدک ۹۹ام رد بشه. راهحلش راه انداختن چند سرور با geo load balancing بوده که به گفته خودش «کمی زیادهروی»ه، هرچند اگه قرار بود این قابلیت رو به یه محصول جدا تبدیل کنه حتماً این کارو میکرد.
نکات کلیدی:
- هدف: نتیجه اتوکامپلیت قبل از رها شدن کلید بعدی توسط کاربر آماده باشه (بودجه زمانی حدود ۱۲۱ میلیثانیه)
- سمت کلاینت: پیشواکشی روی keyDown، نمایش روی keyUp
- سمت سرور: trie تو حافظه برای دامنههای پرترافیک + ایندکس بلاکی روی SSD برای ۲۴۰ میلیون دامنه دیگه
- میانه تاخیر API زیر ۲ میلیثانیه؛ محدودیت اصلی الان تاخیر شبکهست، نه سرعت API
- تاخیر واقعی برای کاربرهای دور (مثلاً آمریکا) هنوز از هدف رد میشه؛ راهحلش چند سرور جغرافیاییـه که فعلاً پیاده نشده




