- بواسطة x32x01 ||
بعد ما اتكلمنا قبل كده عن UUID و ULID، جه وقت نتكلم عن نجم جديد في عالم توليد المعرفات الفريدة: Snowflake ID 
ناس كتير لسه مش عارفة النظام ده، بس الحقيقة إنه من أقوى وأذكى الطرق اللي اتعملت لتوليد Unique IDs بشكل منظم وسريع جدًا
الفكرة بدأت من Twitter لما كانت محتاجة نظام يولّد معرفات سريعة، مرتبة، ومفيهاش تكرار حتى في بيئة فيها آلاف السيرفرات بتشتغل في نفس الوقت
ومن هنا اتولد مفهوم Snowflake اللي بقى دلوقتي ستاندرد عالمي في شركات كبيرة زي Discord وInstagram وغيرها.
الفكرة ببساطة
تخيل إنك عندك سيرفرات كتير جدًا وعايز كل سيرفر يولّد أرقام أو معرفات من غير ما تتكرر.
الحل؟ هو إن كل معرف (ID) يتكوّن من أجزاء محددة تضمن التميّز والترتيب الزمني
مكونات Snowflake ID
كل Snowflake ID بيتكوّن من 3 أجزاء أساسية:
1288834974657
هنلاقي إنه مجرد عدد صحيح (64-bit integer) بيتخزن ويتقارن بسرعة في أي Database
وده بيخليه عملي جدًا في التطبيقات اللي فيها ملايين المعرفات.
مميزات Snowflake IDs
تعالى نلخص شوية مميزات بتخلي Snowflake محبوب عند المبرمجين:
طيب فين العيوب؟
رغم إنه نظام ذكي جدًا، بس برضه ليه شوية عيوب لازم نكون عارفينها:
مقارنة سريعة بين Snowflake وUUID
أمثلة عملية بكود
تعالى نشوف إزاي ممكن تولّد Snowflake ID بلغة Python مثلًا:
الكود البسيط ده بيولّد Snowflake ID مكوّن من الوقت + معرف الجهاز + تسلسل
وطبعًا ممكن تعدله على حسب احتياجاتك في مشروعك
الخلاصة
نقدر نقول إن Snowflake ID هو الحل المثالي لو بتشتغل على مشروع فيه أنظمة موزعة أو بيانات ضخمة جدًا.
هو أسرع وأكفأ من UUID، وبيخليك تتحكم في الترتيب الزمني للبيانات بشكل أنيق ومنظم.
بس لازم تظبط الـinfrastructure كويس وتتابع توقيت السيرفرات، علشان النظام يشتغل بأمان وكفاءة
ناس كتير لسه مش عارفة النظام ده، بس الحقيقة إنه من أقوى وأذكى الطرق اللي اتعملت لتوليد Unique IDs بشكل منظم وسريع جدًا
الفكرة بدأت من Twitter لما كانت محتاجة نظام يولّد معرفات سريعة، مرتبة، ومفيهاش تكرار حتى في بيئة فيها آلاف السيرفرات بتشتغل في نفس الوقت
ومن هنا اتولد مفهوم Snowflake اللي بقى دلوقتي ستاندرد عالمي في شركات كبيرة زي Discord وInstagram وغيرها.
الفكرة ببساطة
تخيل إنك عندك سيرفرات كتير جدًا وعايز كل سيرفر يولّد أرقام أو معرفات من غير ما تتكرر.الحل؟ هو إن كل معرف (ID) يتكوّن من أجزاء محددة تضمن التميّز والترتيب الزمني
مكونات Snowflake ID
كل Snowflake ID بيتكوّن من 3 أجزاء أساسية:- Timestamp

الجزء الأول بيمثل الوقت (بالملي ثانية) اللي اتولد فيه الـID.
وده بيساعدك إن المعرفات تبقى مرتبة بالزمن تلقائيًا. - Machine ID

الجزء ده بيميز كل سيرفر عن التاني، يعني كل سيرفر ليه رقم أو كود خاص بيه.
وده اللي بيمنع إن يحصل تكرار بين الـIDs في أنظمة موزعة. - Sequence Number

الجزء ده بيتغير لو السيرفر نفسه ولّد أكتر من ID في نفس اللحظة.
يعني حتى لو في نفس الـmillisecond، IDs هتفضل Unique 100%.
مثال على Snowflake ID
لو بصينا على رقم زي:1288834974657
هنلاقي إنه مجرد عدد صحيح (64-bit integer) بيتخزن ويتقارن بسرعة في أي Database
وده بيخليه عملي جدًا في التطبيقات اللي فيها ملايين المعرفات.
مميزات Snowflake IDs
تعالى نلخص شوية مميزات بتخلي Snowflake محبوب عند المبرمجين:- مرتبة زمنيًا بشكل طبيعي
يعني تقدر تعرف بسهولة ترتيب العمليات أو البيانات في الزمن بدون أي sorting إضافي
- أصغر من UUID
الـUUID بيبقى طويل جدًا (زي سطر كامل
)
لكن Snowflake ID صغير وسهل التخزين والمعالجة، وده بيوفر أداء أعلى في قواعد البيانات. - مناسب للأنظمة الموزعة
يقدر يشتغل على Distributed Systems من غير أي مشاكل تكرار، حتى مع سيرفرات في أماكن مختلفة حول العالم
- أداء عالي جدًا
لأن كل حاجة بتحصل محليًا (على السيرفر نفسه) من غير استعلامات خارجية. - مناسب للمواقع الضخمة
زي Twitter وDiscord وInstagram اللي بتحتاج ملايين IDs في الثانية
طيب فين العيوب؟
رغم إنه نظام ذكي جدًا، بس برضه ليه شوية عيوب لازم نكون عارفينها:- بيعتمد على توقيت السيرفرات

أي اختلاف بسيط في الساعة (Clock Drift) ممكن يسبب IDs متكررة أو مشاكل في الترتيب. - محتاج إدارة دقيقة للـMachine IDs
لو حصل إن سيرفرين استخدموا نفس Machine ID، النظام ممكن ينهار أو يولّد بيانات متكررة
- أقل مرونة من UUID
UUID تقدر تولدها في أي مكان من غير اعتماد على الوقت أو السيرفر، إنما Snowflake لازم يكون فيه تنسيق مسبق.
مقارنة سريعة بين Snowflake وUUID
| المقارنة | Snowflake ID | UUID |
|---|---|---|
| الحجم | صغير (64-bit) | كبير جدًا (128-bit) |
| الترتيب الزمني | موجود | لأ |
| الأداء | أسرع في التخزين والبحث | أبطأ شوية |
| التكرار | مستحيل تقريبًا | ممكن يحصل نادرًا |
| الاستخدام في الأنظمة الموزعة | ممتاز | جيد |
| الاعتماد على الوقت | ضروري | لا |
أمثلة عملية بكود
تعالى نشوف إزاي ممكن تولّد Snowflake ID بلغة Python مثلًا: Python:
import time
class SnowflakeID:
def __init__(self, machine_id: int):
self.machine_id = machine_id
self.sequence = 0
self.last_timestamp = -1
def _timestamp(self):
return int(time.time() * 1000)
def generate(self):
timestamp = self._timestamp()
if timestamp == self.last_timestamp:
self.sequence += 1
else:
self.sequence = 0
self.last_timestamp = timestamp
return (timestamp << 12) | (self.machine_id << 6) | self.sequence
# مثال استخدام:
snowflake = SnowflakeID(machine_id=3)
print(snowflake.generate()) وطبعًا ممكن تعدله على حسب احتياجاتك في مشروعك
الخلاصة
نقدر نقول إن Snowflake ID هو الحل المثالي لو بتشتغل على مشروع فيه أنظمة موزعة أو بيانات ضخمة جدًا.هو أسرع وأكفأ من UUID، وبيخليك تتحكم في الترتيب الزمني للبيانات بشكل أنيق ومنظم.
بس لازم تظبط الـinfrastructure كويس وتتابع توقيت السيرفرات، علشان النظام يشتغل بأمان وكفاءة
التعديل الأخير: