الأساسيات · فصل ٧

مولّد IDs فريدة في سيستم موزع

Snowflake · UUID · ticket server · 64-bit
🎯 الهدف: تولّد أرقام فريدة ومرتبة بالوقت على كذا سيرفر، من غير ما ترجع لداتابيز واحدة كل مرة.

ليه auto_increment مش كفاية؟

الـ auto_increment بتاع الداتابيز مابيشتغلش كويس لما يبقى عندك كذا سيرفر. المطلوب IDs: فريدة، أرقام بس، ٦٤ بت، مرتبة بالوقت، وآلاف في الثانية.

أربع طرق

الطريقةالفكرةالحكم
Multi-masterكل سيرفر يزود بـ k (عدد السيرفرات)صعب تكبّره، ومش مرتب بالوقت عبر السيرفرات
UUID١٢٨ بت عشوائي، كل سيرفر يولّد لوحدهسهل ومفيش تنسيق. طويل، مش رقم، ومش مرتب
Ticket Serverسيرفر مركزي واحد بيوزع أرقامبسيط. بس SPOF: لو وقع، محدش يقدر يولّد ID
Snowflakeتقسم الـ ٦٤ بت لأجزاءده الحل اللي بنرشّحه

تشريح الـ Snowflake ID

الجزءالحجمبيعمل إيه
sign١ بتدايمًا ٠، عشان الرقم يفضل موجب
timestamp٤١ بتملي ثانية من epoch مخصص — يكفي حوالي ٦٩ سنة، وبيخلي الـ IDs مرتبة بالوقت
datacenter٥ بت٣٢ داتا سنتر
machine٥ بت٣٢ ماكينة في كل داتا سنتر
sequence١٢ بت٤٠٩٦ ID لكل ماكينة في كل ملي ثانية

Checklist الـ IDs

🧠 اختبر نفسك
١) ليه الـ ticket server خطر في سيستم كبير؟
لأنه نقطة فشل واحدة: لو وقع، توليد الـ IDs يقف.
٢) إيه ترتيب أجزاء الـ Snowflake من الشمال لليمين؟
sign، ثم timestamp، ثم datacenter، ثم machine، ثم sequence.
٣) ماكينة واحدة تقدر تولّد كام ID في ملي ثانية واحدة بالنسب دي؟
٤٠٩٦، لأن الـ sequence ١٢ بت.
٤) ساعة سيرفر رجعت لورا ثانيتين. إيه الخطر؟
ممكن يطلع نفس الـ ID تاني، لأن الـ timestamp والـ sequence هيتكرروا.