ما هو معرّف Snowflake؟
معرّف Snowflake هو عدد صحيح 63-بت يُستخدم لتوليد معرّفات فريدة عبر نظام موزّع دون نقطة تنسيق مركزية. طوّرت تويتر هذا التنسيق عام 2010 ليحلّ محلّ التسلسلات ذاتية التزايد في قواعد البيانات التي لم تكن قادرة على التوسّع عبر عشرات خوادم التطبيقات التي تكتب إلى مجموعات MySQL مجزّأة. كل معرّف Snowflake هو عدد صحيح 64-بت بإشارة، تكون البتّة الأكثر أهمية فيه صفرًا دائمًا، مما يترك 63 بتّة للحمولة مقسّمة إلى أربعة حقول: إزاحة طابع زمني 41-بت، ومعرّف مركز بيانات 5-بت، ومعرّف آلة 5-بت، ورقم تسلسلي 12-بت. يتيح هذا التصميم لعقدة خدمة Snowflake واحدة توليد ما يصل إلى 4,096 معرّفًا فريدًا في كل ملي ثانية، مما يمنح النظام إنتاجية نظرية تبلغ ملايين المعرّفات في الثانية عبر نشر مئات من عمليات العامل.
تكون معرّفات Snowflake متزايدة بشكل رتيب — كل معرّف جديد أكبر من سابقه ضمن نفس الحقبة — لكنها ليست متسلسلة بدقة بين العقد. ستنتج آلتان تعملان في نفس الملي ثانية معرّفات متداخلة، وهي مقايضة متعمّدة: يضحّي المخطط بالترتيب المثالي مقابل استقلالية تشغيلية مطلقة. يحتاج كل عامل فقط إلى معرفة رقم مركز البيانات والآلة الخاصين به، بالإضافة إلى الوقت الحالي، لإنتاج معرّف فريد عالميًا دون الحاجة أبدًا إلى استشارة نظير أو خدمة قفل.
تشريح المعرّف 63-بت
يتكوّن معرّف Snowflake من عدد صحيح 63-بت يضم الحقول التالية، من الأكثر أهمية إلى الأقل أهمية:
- طابع زمني 41-بت — ملي ثانية منقضية منذ حقبة مخصّصة.
- معرّف مركز بيانات 5-بت — يحدّد مركز البيانات الفعلي الذي يستضيف العامل.
- معرّف آلة 5-بت — يحدّد المضيف أو العملية الفردية داخل مركز البيانات ذلك.
- رقم تسلسلي 12-بت — عداد لكل ملي ثانية يعود إلى الصفر عندما تدق الساعة إلى الأمام.
العبارة الدقيقة التي تصف هذا التصميم هي: طابع زمني 41-بت، ومركز بيانات 5-بت، وآلة 5-بت، ورقم تسلسلي 12-بت. تشغل هذه الحقول معًا 63 بتّة، مع ضبط بتّة الإشارة الأمامية على صفر بحيث يتسع المعرّف بشكل مريح في عدد صحيح 64-بت بإشارة في لغات مثل Java وC#.
حقبة تويتر ومكوّن الطابع الزمني
يحمل كل معرّف Snowflake إزاحة طابع زمني تُقاس من حقبة مخصّصة: 1288834974657 ملي ثانية. تقابل هذه القيمة تقريبًا 2010-11-04T04:42:54.657Z وقد اختيرت لتتوافق مع بداية نشر Snowflake الداخلي في تويتر. يعني استخدام حقبة مخصّصة بدلًا من حقبة Unix أن حقل الطابع الزمني 41-بت يمكنه تمثيل نطاق يبلغ قرابة 69 عامًا قبل الفيضان. أقصى قيمة يمكن للحقل استيعابها هي 2^41 ناقص 1، أي 2,199,023,255,551 ملي ثانية — حوالي 69.7 سنة بعد الحقبة، مما يدفع تاريخ الانقلاب إلى ثمانينيات القرن الحالي.
لتشفير طابع زمني، اطرح الحقبة من ملي ثانية حقبة Unix الحالية، ثم أزح النتيجة إلى اليسار بمقدار 22 بتّة لإفساح المجال للحقول الثلاثة الأدنى. أي طابع زمني مدخل قبل الحقبة غير صالح ويجب رفضه.
تعريف عقد مركز البيانات والآلة
يقبل كل من حقل مركز البيانات 5-بت وحقل الآلة 5-بت قيمًا من 0 إلى 31، مما يعطي إجمالي 1,024 معرّف عقدة فريد عبر النشر. يُعيَّن للعامل معرّف مركز بيانات ومعرّف آلة عند بدء التشغيل، عادةً عبر ملف تهيئة، أو خدمة تنسيق مثل ZooKeeper، أو وسيط سطر أوامر. يجب أن يكون التعيين فريدًا عبر الأسطول: عاملان يتشاركان نفس زوج (مركز البيانات، الآلة) سينتجان معرّفات متصادمة ما لم تكن ساعاتهما خارج الطور.
تُدرج هذه الحقول في المعرّف عن طريق إزاحة قيمة مركز البيانات إلى اليسار بمقدار 17 بتّة وقيمة الآلة بمقدار 12 بتّة، ثم إجراء عملية OR على القيم المزاحة في العدد الصحيح 63-بت. إجمالي عدد العقد البالغ 1,024 كافٍ لمعظم عمليات النشر الواقعية، لكن البيئات التي تحتاج إلى أكثر من 1,024 عامل يمكنها استعارة بتّات من حقل الرقم التسلسلي أو حقل الطابع الزمني على حساب الإنتاجية أو نطاق الحقبة.
عداد الرقم التسلسلي وحدود الساعة
حقل الرقم التسلسلي 12-بت هو العمود الفقري لتصميم Snowflake. يمتد من 0 إلى 4,095 ويتزايد بمقدار واحد لكل معرّف يُولَّد ضمن نفس الملي ثانية. عندما يصل الرقم التسلسلي إلى 4,095، يدور العامل في حلقة انتظار نشطة حتى تتقدم ساعة النظام إلى الملي ثانية التالية، وعندها يعود الرقم التسلسلي إلى الصفر ويستأنف التوليد. يمنح هذا العقدة الواحدة معدل اندفاع أقصى يبلغ 4,096 معرّفًا في كل ملي ثانية.
انجراف الساعة وتراجع الساعة هما أكثر نمطي فشل أهمية في خوارزمية Snowflake. إذا تحركت ساعة النظام إلى الوراء — سواء بسبب تصحيح NTP، أو ترحيل آلة افتراضية، أو تغيير يدوي — يمكن أن يولّد العامل معرّفًا بطابع زمني أصغر من آخر معرّف أنتجه، مما ينتهك ضمان التفرد. التخفيف المعياري هو إيقاف توليد المعرّفات ورفع خطأ عند اكتشاف تراجع الساعة، مع رفض خدمة الطلبات حتى تلحق الساعة بآخر طابع زمني مسجّل. ينبغي على النشر الذي لا يستطيع تحمّل التوقف أن ينظر في خدمة وقت مخصّصة أو طبقة ساعة منطقية.
مثال عملي
لنأخذ قيم المدخلات التالية: طابع زمني بحقبة Unix مقداره 1700000000000 ملي ثانية، ومعرّف مركز بيانات 7، ومعرّف آلة 13، ورقم تسلسلي 4095.
التشفير. أولًا نحسب إزاحة الطابع الزمني: 1700000000000 ناقص حقبة Snowflake 1288834974657 يساوي 411165025343. نزيح هذه الإزاحة إلى اليسار بمقدار 22 بتّة لنحصل على 1724551110456246272. نزيح قيمة مركز البيانات 7 إلى اليسار بمقدار 17 بتّة لنحصل على 917504. نزيح قيمة الآلة 13 إلى اليسار بمقدار 12 بتّة لنحصل على 53248. لا يحتاج الرقم التسلسلي إلى أي إزاحة. نجمع الحدود الأربعة بعملية OR بتّية لإنتاج معرّف Snowflake النهائي: 1724551110457221119.
فكّ التشفير. لاسترداد الحقول الأصلية من المعرّف 1724551110457221119، نقنِّع أدنى 12 بتّة لاستخراج الرقم التسلسلي: 4095. نزيح لليمين بمقدار 12 بتّة ونقنِّع أدنى 5 بتّات لاسترداد معرّف الآلة: 13. نزيح لليمين بمقدار 17 بتّة ونقنِّع أدنى 5 بتّات لاسترداد معرّف مركز البيانات: 7. نزيح لليمين بمقدار 22 بتّة للحصول على إزاحة الطابع الزمني: 411165025343. نضيف الحقبة 1288834974657 لاسترداد الطابع الزمني الأصلي بحقبة Unix: 1700000000000.
تكون الرحلة ذهابًا وإيابًا دقيقة لأن كل حقل يقع ضمن عرض البتّات المخصّص له ولا تُفقد أي معلومات أثناء التشفير.
الدقة والقيود
مخطط تشفير Snowflake حتمي وقابل للعكس شريطة أن تقع جميع المدخلات ضمن نطاقاتها الصالحة. يجب أن تكون إزاحة الطابع الزمني عددًا صحيحًا غير سالب 41-بت؛ ويجب أن يكون معرّفا مركز البيانات والآلة في النطاق من 0 إلى 31؛ ويجب أن يكون الرقم التسلسلي في النطاق من 0 إلى 4,095. أي مدخل يقع خارج هذه الحدود يُرفض باعتباره غير صالح.
لا يأخذ المخطط في الاعتبار الثواني الكبيسة أو الدقة دون الملي ثانية. يعتمد على ساعة النظام المضيف، التي يمكن أن تنحرف أو تُعدَّل بواسطة عمليات خارجية. في عمليات النشر التي تُقدَّم فيها ساعة النظام بقفزة NTP كبيرة، سيتقدم حقل الإزاحة بشكل صحيح، لكن عداد الرقم التسلسلي سيكون خاملًا خلال الفجوة، مما يترك فترة من المعرّفات غير المصدرة. هذا غير مؤذٍ للتفرد لكنه يخلق انقطاعًا في الخط الزمني للمعرّفات.
العمال المفصولون شبكيًا الذين يتشاركون نفس زوج (مركز البيانات، الآلة) سينتجون معرّفات متصادمة إذا كانوا نشطين في نفس الوقت. توفّر مساحة المعرّفات 1,024 فتحة عقدة فريدة، ويتطلب تجاوز هذا العدد متغيرًا مخصّصًا لتخطيط البتّات.
المصادر
- مستودع Snowflake من تويتر: https://github.com/twitter-archive/snowflake/tree/snowflake-2010
- منشور الإعلان الأصلي: https://blog.x.com/engineering/en_us/a/2010/announcing-snowflake
سجل التحرير
تصف هذه المقالة تنسيق معرّف Snowflake كما هو معرّف في التنفيذ المرجعي لتويتر لعام 2010. تصميم البتّات وقيمة الحقبة مستمدّان مباشرة من الكود المصدري مفتوح المصدر بلغة Scala. تم التحقق من المثال العملي بحساب يدوي يشفّر ويفكّ تشفير نفس القيم لتأكيد صحة الرحلة ذهابًا وإيابًا. تعكس مناقشة تراجع الساعة وحدود العقد الخبرة التشغيلية الموثّقة في أدبيات الهندسة حول توليد المعرّفات الموزّعة.
لا تغطي المقالة تنفيذات الطرف الثالث أو المتغيرات التي تغيّر تخطيط البتّات — مثل تلك التي تستخدم معرّف آلة 10-بت، أو حقبة مختلفة، أو حقل معرّف عامل مستمدّ من خدمة تنسيق. تلك المتغيرات خارج نطاق مواصفة Snowflake الأصلية. المؤلف: فريق تحرير SoupCalc آخر مراجعة: 11 أغسطس 2026.