- بواسطة x32x01 ||
بعد ما اتكلمنا قبل كده عن UUID و ULID، جه وقت نتكلم عن نجم جديد في عالم توليد المعرفات الفريدة: Snowflake ID ⛄
ناس كتير لسه مش عارفة النظام ده، بس الحقيقة إنه من أقوى وأذكى الطرق اللي اتعملت لتوليد Unique IDs بشكل منظم وسريع جدًا 💨
الفكرة بدأت من Twitter لما كانت محتاجة نظام يولّد معرفات سريعة، مرتبة، ومفيهاش تكرار حتى في بيئة فيها آلاف السيرفرات بتشتغل في نفس الوقت ⚙️
ومن هنا اتولد مفهوم Snowflake اللي بقى دلوقتي ستاندرد عالمي في شركات كبيرة زي Discord وInstagram وغيرها.
الحل؟ هو إن كل معرف (ID) يتكوّن من أجزاء محددة تضمن التميّز والترتيب الزمني ⏱️
1288834974657
هنلاقي إنه مجرد عدد صحيح (64-bit integer) بيتخزن ويتقارن بسرعة في أي Database 💾
وده بيخليه عملي جدًا في التطبيقات اللي فيها ملايين المعرفات.
الكود البسيط ده بيولّد 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 كويس وتتابع توقيت السيرفرات، علشان النظام يشتغل بأمان وكفاءة 💪
التعديل الأخير: