شناسه یکتای توزیع‌شده

شناسه یکتا در مقیاس بزرگ: مشکل Auto-Increment، UUID و الگوریتم Snowflake توییتر

مشکل: چه کسی شماره بعدی را می‌دهد؟

در تک‌سرور، AUTO_INCREMENT عالی است. اما با شاردینگ:

راه‌حل ۱: UUID

۱۲۸ بیت تصادفی — تصادم عملاً صفر، بدون هماهنگی!

✓ مزایا✗ عیوب
بدون هماهنگی۱۶ بایت بزرگ + بی‌ترتیب
تولید محلی سریعایندکس B-Tree را می‌کُشد!
تصادم ~صفرنامرتب‌سازی زمانی

مشکل بزرگ: UUID تصادفی = «هرجا» در ایندکس درج می‌شود → صفحه‌بندی شکسته → نوشتن کند (Random I/O!).

راه‌حل ۲: Snowflake (توییتر)

۶۴ بیت مرتب‌شده زمانی و یکتا بدون هماهنگی:

[41 bit زمان][10 bit ماشین][12 bit توالی]
    میلی‌ثانیه    ۱۰۲۴ سرور     ۴۰۹۶/میلی‌ثانیه

~۶۹ سال عمر | ۴ میلیون ID/ثانیه | مرتب زمانی ✓

مقایسه

معیارAuto-IncrementUUIDSnowflake
یکتایی توزیع‌شده✗✓✓
مرتب زمانی✓✗✓
اندازه۴-۸ بایت ✓۱۶ بایت۸ بایت ✓
ایندکس‌پسند✓✓✗✗✓✓
هماهنگی لازممرکزی!هیچ ✓هیچ ✓

نکات عملی

نکته مصاحبه: «چرا UUID نه؟» = «ایندکس تصادفی و بی‌ترتیب» — این پاسخ عمق شما را نشان می‌دهد. Snowflake را با ساختار بیتی‌اش توضیح دهید!

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل طراحی سیستم (System Design) است.

ابزارهای مرتبط