🛠️

Whiz Tools

Build • Create • Innovate

مولد معرفات سنوفلايك لتحليل الأنظمة الموزعة

قم بإنشاء وتحليل معرفات سنوفلايك الخاصة بتويتر، وهي معرفات فريدة مكونة من 64 بت تُستخدم في الأنظمة الموزعة. تتيح لك هذه الأداة إنشاء معرفات سنوفلايك جديدة وتحليل الموجودة منها، مما يوفر رؤى حول مكوناتها مثل الطابع الزمني ومعرف الآلة ورقم التسلسل.

مولد معرف سنوفلايك

مولد معرف سنوفلايك

Optional: Unix timestamp in milliseconds (defaults to current time)
📚

الوثائق

مولد معرف سنوفليك

مقدمة

معرف سنوفليك هو معرف فريد يُستخدم في الأنظمة الموزعة، تم تطويره في الأصل بواسطة تويتر. تتيح لك هذه الأداة إنشاء وتحليل معرفات سنوفليك، التي هي أعداد صحيحة مكونة من 64 بت تتكون من طابع زمني، ومعرف آلة، ورقم تسلسلي.

كيفية عمل معرفات سنوفليك

معرفات سنوفليك هي أعداد صحيحة مكونة من 64 بت مُهيكلة كما يلي:

  • 41 بت: طابع زمني (بالمللي ثانية منذ بداية زمن مخصص)
  • 10 بت: معرف آلة (5 بتات لمعرف مركز البيانات، 5 بتات لمعرف العامل)
  • 12 بت: رقم تسلسلي

تسمح هذه البنية بإنشاء حوالي 4096 معرف فريد لكل مللي ثانية لكل آلة.

استخدام مولد معرف سنوفليك

  1. (اختياري) تعيين زمن مخصص (الافتراضي هو زمن تويتر: 2010-11-04T01:42:54.657Z)
  2. إدخال معرف آلة (0-31) ومعرف مركز بيانات (0-31)
  3. انقر على "إنشاء" لإنشاء معرف سنوفليك جديد
  4. سيتم عرض المعرف المُولد ومكوناته

لتحليل معرف سنوفليك موجود، أدخله في حقل "تحليل المعرف" وانقر على "تحليل".

المعادلة

يتم بناء معرف سنوفليك باستخدام العمليات البتية:

1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2

حيث:

  • timestamp هو عدد المللي ثانية منذ بداية الزمن
  • datacenterId هو عدد صحيح مكون من 5 بتات (0-31)
  • workerId هو عدد صحيح مكون من 5 بتات (0-31)
  • sequence هو عدد صحيح مكون من 12 بت (0-4095)

الحساب

يقوم مولد معرف سنوفليك بتنفيذ الخطوات التالية:

  1. الحصول على الطابع الزمني الحالي بالمللي ثانية
  2. التأكد من أن الطابع الزمني أكبر من آخر طابع زمني مستخدم (لضمان الفريدة)
  3. إذا كان الطابع الزمني هو نفسه آخر طابع زمني، قم بزيادة رقم التسلسل
  4. إذا تجاوز رقم التسلسل (وصل إلى 4096)، انتظر حتى المللي ثانية التالية
  5. دمج المكونات باستخدام العمليات البتية لإنشاء المعرف النهائي

حالات الاستخدام

تكون معرفات سنوفليك مفيدة بشكل خاص في:

  1. الأنظمة الموزعة: إنشاء معرفات فريدة عبر عدة آلات دون تنسيق
  2. البيانات عالية الحجم: إنشاء معرفات قابلة للفرز لمجموعات البيانات الكبيرة
  3. الخدمات الدقيقة: ضمان وجود معرفات فريدة عبر خدمات مختلفة
  4. تقسيم قواعد البيانات: استخدام مكون الطابع الزمني أو معرف الآلة للتقسيم الفعال

البدائل

بينما تعتبر معرفات سنوفليك قوية، تشمل أنظمة توليد المعرفات الأخرى:

  1. UUID (معرف فريد عالميًا): مفيد عند الحاجة إلى توليد موزع دون القدرة على الفرز
  2. معرفات قاعدة البيانات المتزايدة تلقائيًا: بسيطة ولكن محدودة إلى مثيلات قاعدة بيانات واحدة
  3. ULID (معرف عالمي فريد قابل للفرز بشكل معجمي): مشابه لسنوفليك، ولكن مع بنية مختلفة

الحالات الحدية والقيود

  1. مزامنة الساعة: تعتمد معرفات سنوفليك على وقت النظام. إذا تحركت الساعة للخلف بسبب تعديلات NTP أو تغييرات التوقيت الصيفي، فقد تسبب مشاكل في توليد المعرفات.

  2. مشكلة عام 2038: ستفيض الطابع الزمني المكون من 41 بت في عام 2079 (بافتراض زمن تويتر). يجب على الأنظمة التي تستخدم معرفات سنوفليك التخطيط لهذه الحالة المستقبلية.

  3. تصادمات معرف الآلة: في الأنظمة الموزعة الكبيرة، قد يكون ضمان معرفات الآلة الفريدة تحديًا وقد يتطلب تنسيقًا إضافيًا.

  4. تجاوز رقم التسلسل: في السيناريوهات ذات الإنتاجية العالية للغاية، من الممكن استنفاد 4096 تسلسل لكل مللي ثانية، مما قد يتسبب في تأخيرات.

  5. عدم الترتيب عبر الآلات: بينما تكون المعرفات في تزايد أحادي على آلة واحدة، قد لا تكون متزايدة بشكل صارم عبر آلات متعددة.

التاريخ

تم تقديم معرفات سنوفليك بواسطة تويتر في عام 2010 لتلبية الحاجة إلى معرفات فريدة قابلة للفرز زمنياً موزعة. منذ ذلك الحين، تم اعتمادها وتكييفها من قبل العديد من الشركات والمشاريع الأخرى.

أمثلة

إليك تطبيقات لمولدات معرفات سنوفليك بلغات مختلفة:

1class SnowflakeGenerator {
2  constructor(epoch = 1288834974657, datacenterIdBits = 5, workerIdBits = 5, sequenceBits = 12) {
3    this.epoch = BigInt(epoch);
4    this.datacenterIdBits = datacenterIdBits;
5    this.workerIdBits = workerIdBits;
6    this.sequenceBits = sequenceBits;
7    this.maxDatacenterId = -1n ^ (-1n << BigInt(datacenterIdBits));
8    this.maxWorkerId = -1n ^ (-1n << BigInt(workerIdBits));
9    this.sequenceMask = -1n ^ (-1n << BigInt(sequenceBits));
10    this.workerIdShift = BigInt(sequenceBits);
11    this.datacenterIdShift = BigInt(sequenceBits + workerIdBits);
12    this.timestampLeftShift = BigInt(sequenceBits + workerIdBits + datacenterIdBits);
13    this.sequence = 0n;
14    this.lastTimestamp = -1n;
15  }
16
17  nextId(datacenterId, workerId) {
18    let timestamp = this.currentTimestamp();
19
20    if (timestamp < this.lastTimestamp) {
21      throw new Error('Clock moved backwards. Refusing to generate id');
22    }
23
24    if (timestamp === this.lastTimestamp) {
25      this.sequence = (this.sequence + 1n) & this.sequenceMask;
26      if (this.sequence === 0n) {
27        timestamp = this.tilNextMillis(this.lastTimestamp);
28      }
29    } else {
30      this.sequence = 0n;
31    }
32
33    this.lastTimestamp = timestamp;
34
35    return ((timestamp - this.epoch) << this.timestampLeftShift) |
36           (BigInt(datacenterId) << this.datacenterIdShift) |
37           (BigInt(workerId) << this.workerIdShift) |
38           this.sequence;
39  }
40
41  tilNextMillis(lastTimestamp) {
42    let timestamp = this.currentTimestamp();
43    while (timestamp <= lastTimestamp) {
44      timestamp = this.currentTimestamp();
45    }
46    return timestamp;
47  }
48
49  currentTimestamp() {
50    return BigInt(Date.now());
51  }
52}
53
54// الاستخدام
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`تم إنشاء معرف سنوفليك: ${id}`);
58

الرسم البياني

إليك تمثيل بصري لبنية معرف سنوفليك:

طابع زمني (41 بت) معرف الآلة (10 بتات) رقم تسلسلي (12 بت)

بنية معرف سنوفليك المكون من 64 بت

المراجع

  1. "إعلان سنوفليك." مدونة هندسة تويتر، https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "معرف سنوفليك." ويكيبيديا، https://en.wikipedia.org/wiki/Snowflake_ID
  3. "توليد المعرفات الموزعة في الخدمات الدقيقة." ميديم، https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f