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

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

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

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

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

مستندات

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

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

یک تولیدکننده شناسه اسنوفلیک شناسه‌های منحصر به فردی برای سیستم‌های توزیع‌شده ایجاد می‌کند که در ابتدا توسط توییتر برای مدیریت پردازش داده‌های مقیاس بزرگ توسعه یافته است. این تولیدکننده شناسه منحصر به فرد قدرتمند، اعداد صحیح ۶۴ بیتی تولید می‌کند که از یک زمان‌سنج، شناسه ماشین و شماره توالی تشکیل شده است و منحصر به فرد بودن در سیستم‌های توزیع‌شده را بدون نیاز به هماهنگی بین سرورها تضمین می‌کند.

ابزار آنلاین رایگان تولیدکننده شناسه اسنوفلیک ما به شما این امکان را می‌دهد که به‌طور فوری شناسه‌های اسنوفلیک را تولید و تجزیه کنید، که آن را برای توسعه‌دهندگان کار با میکروسرویس‌ها، پایگاه‌های داده توزیع‌شده و برنامه‌های با توان بالا ایده‌آل می‌سازد.

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

شناسه‌های اسنوفلیک اعداد صحیح ۶۴ بیتی با ساختاری به‌دقت طراحی‌شده هستند که منحصر به فرد بودن را تضمین می‌کند:

  • ۴۱ بیت: زمان‌سنج (میلی‌ثانیه‌ها از یک اپوک سفارشی)
  • ۱۰ بیت: شناسه ماشین (۵ بیت برای شناسه مرکز داده، ۵ بیت برای شناسه کارگر)
  • ۱۲ بیت: شماره توالی

این ساختار شناسه توزیع‌شده امکان تولید تقریباً ۴,۰۹۶ شناسه منحصر به فرد در هر میلی‌ثانیه برای هر ماشین را فراهم می‌کند و آن را برای سیستم‌های توزیع‌شده با توان بالا ایده‌آل می‌سازد.

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

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

  1. تنظیم اپوک سفارشی (اختیاری): از اپوک پیش‌فرض توییتر (۲۰۱۰-۱۱-۰۴T01:42:54.657Z) استفاده کنید یا خودتان تنظیم کنید
  2. پیکربندی شناسه‌های ماشین: شناسه ماشین (۰-۳۱) و شناسه مرکز داده (۰-۳۱) را وارد کنید
  3. تولید شناسه: روی "تولید" کلیک کنید تا یک شناسه منحصر به فرد جدید اسنوفلیک ایجاد کنید
  4. مشاهده نتایج: شناسه تولید شده و تجزیه و تحلیل اجزای آن را مشاهده کنید

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

برای کدگشایی یک شناسه اسنوفلیک، آن را در فیلد "تجزیه شناسه" وارد کنید و روی "تجزیه" کلیک کنید تا زمان‌سنج، شناسه ماشین و اجزای توالی آن را ببینید.

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

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

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

اجزای فرمول:

  • timestamp: تعداد میلی‌ثانیه‌ها از اپوک
  • datacenterId: عدد صحیح ۵ بیتی (۰-۳۱) که مرکز داده را شناسایی می‌کند
  • workerId: عدد صحیح ۵ بیتی (۰-۳۱) که ماشین کارگر را شناسایی می‌کند
  • sequence: عدد صحیح ۱۲ بیتی (۰-۴۰۹۵) برای چندین شناسه در هر میلی‌ثانیه

فرآیند محاسبه شناسه اسنوفلیک

الگوریتم تولید شناسه اسنوفلیک این مراحل دقیق را دنبال می‌کند:

  1. دریافت زمان‌سنج فعلی: زمان فعلی را به میلی‌ثانیه‌ها دریافت کنید
  2. تضمین ترتیب زمانی: تأیید کنید که زمان‌سنج بیشتر از زمان‌سنج آخرین استفاده شده است
  3. مدیریت زمان‌سنج یکسان: اگر زمان‌سنج با قبلی مطابقت دارد، شماره توالی را افزایش دهید
  4. جلوگیری از سرریز: اگر توالی به ۴۰۹۶ برسد، برای میلی‌ثانیه بعدی صبر کنید
  5. ترکیب اجزا: از عملیات بیتی برای ایجاد شناسه منحصر به فرد نهایی استفاده کنید

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

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

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

موارد استفاده اصلی

  1. سیستم‌های توزیع‌شده: تولید شناسه‌های منحصر به فرد در چندین ماشین بدون نیاز به هماهنگی
  2. پردازش داده‌های با حجم بالا: ایجاد شناسه‌های قابل مرتب‌سازی برای مجموعه‌های داده بزرگ
  3. معماری میکروسرویس‌ها: تضمین شناسه‌های منحصر به فرد در خدمات مختلف
  4. تقسیم‌بندی پایگاه داده: استفاده از اجزای زمان‌سنج یا شناسه ماشین برای تقسیم‌بندی کارآمد داده‌ها

کاربردهای دنیای واقعی

  • پلتفرم‌های رسانه‌های اجتماعی: توییتر، اینستاگرام برای شناسه‌های پست و کاربر
  • سیستم‌های تجارت الکترونیک: ردیابی سفارش و مدیریت موجودی
  • جمع‌آوری داده‌های IoT: ثبت رویدادهای دستگاه و داده‌های حسگر
  • سیستم‌های مالی: پردازش تراکنش و ردیابی حسابرسی

جایگزین‌ها و مقایسه‌های شناسه اسنوفلیک

در حالی که شناسه‌های اسنوفلیک قدرتمند هستند، سیستم‌های دیگر تولید شناسه منحصر به فرد شامل:

سیستم‌های شناسه جایگزین

  1. UUID (شناسه منحصر به فرد جهانی): بهترین برای تولید توزیع‌شده بدون نیاز به قابلیت مرتب‌سازی
  2. شناسه‌های خودافزایشی پایگاه داده: راه‌حل ساده‌ای که محدود به نمونه‌های پایگاه داده واحد است
  3. ULID (شناسه منحصر به فرد جهانی قابل مرتب‌سازی به صورت لغت‌نامه‌ای): مشابه اسنوفلیک با کدگذاری base32
  4. NanoID: تولیدکننده رشته منحصر به فرد فشرده و ایمن برای وب‌برنامه‌ها

محدودیت‌ها و ملاحظات شناسه اسنوفلیک

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

چالش‌های رایج

  1. مشکلات همزمان‌سازی ساعت: وابستگی‌های زمان سیستم می‌تواند باعث مشکلاتی با تنظیمات NTP یا تغییرات ساعت تابستانی شود
  2. محدودیت سال ۲۰۷۹: سرریز زمان‌سنج ۴۱ بیتی نیاز به برنامه‌ریزی بلندمدت برای سیستم‌های با مقیاس بالا دارد
  3. مدیریت شناسه ماشین: تضمین شناسه‌های منحصر به فرد ماشین در سیستم‌های توزیع‌شده بزرگ نیاز به هماهنگی دارد
  4. سرریز توالی: سناریوهای با توان بسیار بالا ممکن است ۴۰۹۶ توالی در هر میلی‌ثانیه را تمام کنند
  5. ترتیب بین ماشین‌ها: شناسه‌ها در هر ماشین به‌طور مداوم هستند اما در سطح جهانی در تمام ماشین‌ها این‌گونه نیستند

تاریخچه شناسه‌های اسنوفلیک

شناسه‌های اسنوفلیک در سال ۲۰۱۰ توسط توییتر معرفی شدند تا چالش تولید شناسه‌های منحصر به فرد توزیع‌شده و قابل مرتب‌سازی بر اساس زمان را در مقیاس بزرگ حل کنند. با افزایش سریع تعداد کاربران و حجم توییت‌ها در توییتر، شناسه‌های خودافزایشی سنتی برای معماری توزیع‌شده آن‌ها کافی نبودند.

این سیستم از آن زمان توسط شرکت‌های بزرگ فناوری از جمله اینستاگرام، دیسکورد و بی‌شماری دیگر از پلتفرم‌ها که نیاز به تولید شناسه مقیاس‌پذیر برای سیستم‌های توزیع‌شده دارند، پذیرفته شده است.

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

پیاده‌سازی تولید شناسه اسنوفلیک در زبان برنامه‌نویسی مورد نظر خود:

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('ساعت به عقب حرکت کرده است. از تولید شناسه خودداری می‌شود');
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
require 'time' class SnowflakeGenerator def initialize(datacenter_id, worker_id, sequence = 0) @datacenter_id = datacenter_id @worker_id = worker_id @sequence = sequence @last_timestamp = -1 @epoch = 1288834974657 @datacenter_id_bits = 5 @worker_id_bits = 5 @sequence_bits = 12 @max_datacenter_id = -1 ^ (-1 << @datacenter_id_bits) @max_worker_id = -1 ^ (-1 << @worker_id_bits) @worker_id_shift = @sequence_bits @datacenter_id_shift = @sequence_bits + @worker_id_bits @timestamp_left_shift = @sequence_bits + @worker_id_bits + @datacenter_id_bits @sequence_mask = -1 ^ (-1 << @sequence_bits) end def next_id timestamp = (Time.now.to_f * 1000).to_i raise 'ساعت به عقب حرکت کرده است' if timestamp < @last_timestamp if timestamp == @last_timestamp @sequence = (@sequence + 1) & @sequence_mask timestamp = til_next_millis(@last_timestamp) if @sequence == 0 else @sequence = 0 end @last_timestamp = timestamp ((timestamp - @epoch