🛠️

Whiz Tools

Build • Create • Innovate

ابزار تولید و تحلیل شناسه‌های اسنوفلک توییتر

شناسه‌های اسنوفلک توییتر را تولید و تحلیل کنید، شناسه‌های منحصر به فرد 64 بیتی که در سیستم‌های توزیع شده استفاده می‌شوند. این ابزار به شما اجازه می‌دهد شناسه‌های جدید اسنوفلک ایجاد کنید و شناسه‌های موجود را تجزیه و تحلیل کنید و بینش‌هایی درباره اجزای زمان‌سنج، شناسه ماشین و شماره توالی آن‌ها ارائه می‌دهد.

ژنراتور شناسه اسنوفلک

ژنراتور شناسه اسنوفلک

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

مستندات

تولید کننده شناسه اسنوفلیک

مقدمه

شناسه اسنوفلیک یک شناسه منحصر به فرد است که در سیستم‌های توزیع‌شده استفاده می‌شود و در ابتدا توسط توییتر توسعه یافته است. این ابزار به شما اجازه می‌دهد تا شناسه‌های اسنوفلیک را تولید و تحلیل کنید، که اعداد صحیح 64 بیتی هستند و از یک زمان، شناسه ماشین و شماره توالی تشکیل شده‌اند.

نحوه کار شناسه‌های اسنوفلیک

شناسه‌های اسنوفلیک اعداد صحیح 64 بیتی هستند که به صورت زیر ساختار یافته‌اند:

  • 41 بیت: زمان (میلی‌ثانیه‌ها از یک اپوک سفارشی)
  • 10 بیت: شناسه ماشین (5 بیت برای شناسه مرکز داده، 5 بیت برای شناسه کارگر)
  • 12 بیت: شماره توالی

این ساختار اجازه تولید تقریباً 4,096 شناسه منحصر به فرد در هر میلی‌ثانیه برای هر ماشین را می‌دهد.

استفاده از تولید کننده شناسه اسنوفلیک

  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// Usage
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generated Snowflake ID: ${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