تیک سبز نام کاربری چطوری اینقدر سریع میاد؟
خلاصهٔ کاملتر
نویسنده تو این مقاله سراغ یه سؤال ساده رفته: وقتی توی فرم ثبتنام اسم میزنی، اون تیک سبز چطوری قبل از اینکه دستت از کیبورد بلند شه میاد؟ جوابش یه چیز جادویی نیست، یه پشته از لایههاست که هر کدوم از لایهٔ پشت سرش ارزونتره. نویسنده تأکید میکنه این توصیف کد اینستاگرام نیست؛ اینه که اگه بخوای همچین رفتاری بسازی، معمولاً از چه قطعههایی استفاده میکنی و هر کدوم چرا اونجان.
مشکل اصلی خود کوئری نیست. یه جستوجو روی ایندکس یکتا حتی با یک میلیارد رکورد یکی دو میلیثانیه طول میکشه. چیزی که کمر رو میشکنه شکل ترافیکه: هر حرفی که کاربر تایپ میکنه یه درخواست جداست، پس چک کردن اسم خیلی بیشتر از خود ثبتنام بار تولید میکنه. اولین لایه هم دقیقاً همین رو هدف میگیره؛ کلاینت قاعدهها رو خودش چک میکنه، فقط بعد از ۲۵۰ میلیثانیه مکث درخواست میفرسته و درخواست قبلی رو کنسل میکنه تا جواب کند قدیمی روی جواب جدید ننشینه.
لایهٔ بعدی یه فیلتر بلومه، یعنی یه آرایهٔ بزرگ از بیتها که با چند تابع هش پر میشه و فقط میتونه بگه یه اسم قطعاً ثبت نشده یا شاید شده. جواب منفیش قطعیه و جواب مثبتش فقط یه احتماله، و همین عدم تقارن کل ترفنده: «قطعاً آزاده» مستقیم برمیگرده به کاربر و فقط «شاید»ها به جستوجوی واقعی میرسن. برای یک میلیارد اسم با نرخ خطای ۱ درصد حدود ۹.۶ بیت به ازای هر اسم لازمه، یعنی تقریباً ۱.۲ گیگابایت و ۷ تابع هش که تو حافظهٔ یه سرور معمولی جا میشه.
فیلتر بلوم دو تا محدودیت داره که نویسنده روشون دست میذاره. اول اینکه حذف نداره، چون پاک کردن بیتهای یه اسم ممکنه بیتهای اسمهای دیگه رو هم خراب کنه؛ پس اسمی که آزاد شده تا وقتی فیلتر از روی جدول بازسازی نشه همچنان «شاید» میمونه. دوم اینکه روی هر سرور یه کپی جداست و ممکنه چند لحظه عقب باشه. «شاید»ها هم میرن سراغ ایندکس روی رپلیکا یا یه کش از اسمهای گرفتهشده، که اون هم لگ داره.
پس همهٔ این لایهها ممکنه اشتباهی بگن «آزاده»، و به گفتهٔ نویسنده اشکالی نداره، چون هیچکدوم جواب واقعی نیستن. جواب واقعی قید یکتای دیتابیسه، درست لحظهٔ درج: دو نفر میتونن همزمان یه اسم رو تایپ کنن، هر دو تیک سبز بگیرن و ثبتنام رو بزنن؛ اولی برنده میشه و دومی یه پیام تمیز میگیره. یه نکتهٔ جانبی هم اینه که الفبای محدود (حروف کوچک، رقم و چند جداکننده) جلوی حروف شبیهبههم مثل «a» سیریلیک رو میگیره.
نکات کلیدی:
- هر کیبورد زدن یه درخواسته؛ تأخیر ۲۵۰ میلیثانیهای و کنسل کردن درخواست قبلی، ترافیک رو یه مرتبه کم میکنه.
- فیلتر بلوم فقط جواب «قطعاً آزاد» میده؛ جواب مثبتش همیشه یه احتماله و باید با یه جستوجوی واقعی تأیید بشه.
- یک میلیارد اسم با نرخ خطای ۱ درصد: حدود ۹.۶ بیت برای هر اسم، تقریباً ۱.۲ گیگابایت و ۷ تابع هش.
- هر ده برابر کم کردن نرخ خطا حدود ۴.۸ بیت بیشتر به ازای هر اسم میخواد، یعنی حدود ۰.۶ گیگابایت بیشتر برای هر میلیارد اسم.
- فیلتر بلوم ساده حذف نداره؛ برای اسمهای آزادشده یا باید بازسازی بشه یا از نسخهٔ شمارندهدار استفاده کنی.
- تنها تضمین واقعی، قید یکتاست موقع درج توی دیتابیس؛ چک قبل از نوشتن فقط یه راهنماییه.
- اسمهای رزروشده مثل admin هم باید توی جدول و توی فیلتر باشن، وگرنه فیلتر «قطعاً آزاد» جوابشون میده.




