ابزار تولید و تحلیل شناسه برفراز توییتر برای بینشها
شناسههای برفراز توییتر را تولید و تحلیل کنید، شناسههای منحصر به فرد ۶۴ بیتی که در سیستمهای توزیعشده استفاده میشوند. این ابزار به شما امکان میدهد شناسههای برفراز جدید ایجاد کنید و شناسههای موجود را تجزیه و تحلیل کنید و بینشهایی درباره اجزای زمانسنج، شناسه ماشین و شماره توالی آنها ارائه میدهد.
ژنراتور شناسه اسنوفلیک
ژنراتور شناسه اسنوفلیک
مستندات
تولیدکننده شناسه اسنوفلیک: ایجاد شناسههای منحصر به فرد برای سیستمهای توزیعشده
تولیدکننده شناسه اسنوفلیک چیست؟
یک تولیدکننده شناسه اسنوفلیک شناسههای منحصر به فردی برای سیستمهای توزیعشده ایجاد میکند که در ابتدا توسط توییتر برای مدیریت پردازش دادههای مقیاس بزرگ توسعه یافته است. این تولیدکننده شناسه منحصر به فرد قدرتمند، اعداد صحیح ۶۴ بیتی تولید میکند که از یک زمانسنج، شناسه ماشین و شماره توالی تشکیل شده است و منحصر به فرد بودن در سیستمهای توزیعشده را بدون نیاز به هماهنگی بین سرورها تضمین میکند.
ابزار آنلاین رایگان تولیدکننده شناسه اسنوفلیک ما به شما این امکان را میدهد که بهطور فوری شناسههای اسنوفلیک را تولید و تجزیه کنید، که آن را برای توسعهدهندگان کار با میکروسرویسها، پایگاههای داده توزیعشده و برنامههای با توان بالا ایدهآل میسازد.
نحوه کار تولید شناسه اسنوفلیک
شناسههای اسنوفلیک اعداد صحیح ۶۴ بیتی با ساختاری بهدقت طراحیشده هستند که منحصر به فرد بودن را تضمین میکند:
- ۴۱ بیت: زمانسنج (میلیثانیهها از یک اپوک سفارشی)
- ۱۰ بیت: شناسه ماشین (۵ بیت برای شناسه مرکز داده، ۵ بیت برای شناسه کارگر)
- ۱۲ بیت: شماره توالی
این ساختار شناسه توزیعشده امکان تولید تقریباً ۴,۰۹۶ شناسه منحصر به فرد در هر میلیثانیه برای هر ماشین را فراهم میکند و آن را برای سیستمهای توزیعشده با توان بالا ایدهآل میسازد.
نحوه استفاده از ابزار تولیدکننده شناسه اسنوفلیک ما
برای تولید شناسههای منحصر به فرد اسنوفلیک این مراحل ساده را دنبال کنید:
- تنظیم اپوک سفارشی (اختیاری): از اپوک پیشفرض توییتر (۲۰۱۰-۱۱-۰۴T01:42:54.657Z) استفاده کنید یا خودتان تنظیم کنید
- پیکربندی شناسههای ماشین: شناسه ماشین (۰-۳۱) و شناسه مرکز داده (۰-۳۱) را وارد کنید
- تولید شناسه: روی "تولید" کلیک کنید تا یک شناسه منحصر به فرد جدید اسنوفلیک ایجاد کنید
- مشاهده نتایج: شناسه تولید شده و تجزیه و تحلیل اجزای آن را مشاهده کنید
تجزیه شناسههای اسنوفلیک موجود
برای کدگشایی یک شناسه اسنوفلیک، آن را در فیلد "تجزیه شناسه" وارد کنید و روی "تجزیه" کلیک کنید تا زمانسنج، شناسه ماشین و اجزای توالی آن را ببینید.
فرمول تولید شناسه اسنوفلیک
الگوریتم شناسه اسنوفلیک شناسههای منحصر به فرد را با استفاده از عملیات بیتی ایجاد میکند:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
اجزای فرمول:
timestamp
: تعداد میلیثانیهها از اپوکdatacenterId
: عدد صحیح ۵ بیتی (۰-۳۱) که مرکز داده را شناسایی میکندworkerId
: عدد صحیح ۵ بیتی (۰-۳۱) که ماشین کارگر را شناسایی میکندsequence
: عدد صحیح ۱۲ بیتی (۰-۴۰۹۵) برای چندین شناسه در هر میلیثانیه
فرآیند محاسبه شناسه اسنوفلیک
الگوریتم تولید شناسه اسنوفلیک این مراحل دقیق را دنبال میکند:
- دریافت زمانسنج فعلی: زمان فعلی را به میلیثانیهها دریافت کنید
- تضمین ترتیب زمانی: تأیید کنید که زمانسنج بیشتر از زمانسنج آخرین استفاده شده است
- مدیریت زمانسنج یکسان: اگر زمانسنج با قبلی مطابقت دارد، شماره توالی را افزایش دهید
- جلوگیری از سرریز: اگر توالی به ۴۰۹۶ برسد، برای میلیثانیه بعدی صبر کنید
- ترکیب اجزا: از عملیات بیتی برای ایجاد شناسه منحصر به فرد نهایی استفاده کنید
این فرآیند شناسههای بهطور مداوم در حال افزایش را در هر ماشین تضمین میکند در حالی که منحصر به فرد بودن جهانی را در سیستمهای توزیعشده حفظ میکند.
موارد استفاده و کاربردهای شناسه اسنوفلیک
شناسههای اسنوفلیک در سناریوهای مختلف محاسبات توزیعشده عالی هستند:
موارد استفاده اصلی
- سیستمهای توزیعشده: تولید شناسههای منحصر به فرد در چندین ماشین بدون نیاز به هماهنگی
- پردازش دادههای با حجم بالا: ایجاد شناسههای قابل مرتبسازی برای مجموعههای داده بزرگ
- معماری میکروسرویسها: تضمین شناسههای منحصر به فرد در خدمات مختلف
- تقسیمبندی پایگاه داده: استفاده از اجزای زمانسنج یا شناسه ماشین برای تقسیمبندی کارآمد دادهها
کاربردهای دنیای واقعی
- پلتفرمهای رسانههای اجتماعی: توییتر، اینستاگرام برای شناسههای پست و کاربر
- سیستمهای تجارت الکترونیک: ردیابی سفارش و مدیریت موجودی
- جمعآوری دادههای IoT: ثبت رویدادهای دستگاه و دادههای حسگر
- سیستمهای مالی: پردازش تراکنش و ردیابی حسابرسی
جایگزینها و مقایسههای شناسه اسنوفلیک
در حالی که شناسههای اسنوفلیک قدرتمند هستند، سیستمهای دیگر تولید شناسه منحصر به فرد شامل:
سیستمهای شناسه جایگزین
- UUID (شناسه منحصر به فرد جهانی): بهترین برای تولید توزیعشده بدون نیاز به قابلیت مرتبسازی
- شناسههای خودافزایشی پایگاه داده: راهحل سادهای که محدود به نمونههای پایگاه داده واحد است
- ULID (شناسه منحصر به فرد جهانی قابل مرتبسازی به صورت لغتنامهای): مشابه اسنوفلیک با کدگذاری base32
- NanoID: تولیدکننده رشته منحصر به فرد فشرده و ایمن برای وببرنامهها
محدودیتها و ملاحظات شناسه اسنوفلیک
درک محدودیتهای شناسه اسنوفلیک به پیادهسازی صحیح کمک میکند:
چالشهای رایج
- مشکلات همزمانسازی ساعت: وابستگیهای زمان سیستم میتواند باعث مشکلاتی با تنظیمات NTP یا تغییرات ساعت تابستانی شود
- محدودیت سال ۲۰۷۹: سرریز زمانسنج ۴۱ بیتی نیاز به برنامهریزی بلندمدت برای سیستمهای با مقیاس بالا دارد
- مدیریت شناسه ماشین: تضمین شناسههای منحصر به فرد ماشین در سیستمهای توزیعشده بزرگ نیاز به هماهنگی دارد
- سرریز توالی: سناریوهای با توان بسیار بالا ممکن است ۴۰۹۶ توالی در هر میلیثانیه را تمام کنند
- ترتیب بین ماشینها: شناسهها در هر ماشین بهطور مداوم هستند اما در سطح جهانی در تمام ماشینها اینگونه نیستند
تاریخچه شناسههای اسنوفلیک
شناسههای اسنوفلیک در سال ۲۰۱۰ توسط توییتر معرفی شدند تا چالش تولید شناسههای منحصر به فرد توزیعشده و قابل مرتبسازی بر اساس زمان را در مقیاس بزرگ حل کنند. با افزایش سریع تعداد کاربران و حجم توییتها در توییتر، شناسههای خودافزایشی سنتی برای معماری توزیعشده آنها کافی نبودند.
این سیستم از آن زمان توسط شرکتهای بزرگ فناوری از جمله اینستاگرام، دیسکورد و بیشماری دیگر از پلتفرمها که نیاز به تولید شناسه مقیاسپذیر برای سیستمهای توزیعشده دارند، پذیرفته شده است.
مثالهای کد تولیدکننده شناسه اسنوفلیک
پیادهسازی تولید شناسه اسنوفلیک در زبان برنامهنویسی مورد نظر خود:
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
1import time
2import threading
3
4class SnowflakeGenerator:
5 def __init__(self, datacenter_id, worker_id, sequence=0):
6 self.datacenter_id = datacenter_id
7 self.worker_id = worker_id
8 self.sequence = sequence
9
10 self.last_timestamp = -1
11 self.epoch = 1288834974657
12
13 self.datacenter_id_bits = 5
14 self.worker_id_bits = 5
15 self.sequence_bits = 12
16
17 self.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)
18 self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)
19
20 self.worker_id_shift = self.sequence_bits
21 self.datacenter_id_shift = self.sequence_bits + self.worker_id_bits
22 self.timestamp_left_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bits
23 self.sequence_mask = -1 ^ (-1 << self.sequence_bits)
24
25 self._lock = threading.Lock()
26
27 def _til_next_millis(self, last_timestamp):
28 timestamp = self._get_timestamp()
29 while timestamp <= last_timestamp:
30 timestamp = self._get_timestamp()
31 return timestamp
32
33 def _get_timestamp(self):
34 return int(time.time() * 1000)
35
36 def next_id(self):
37 with self._lock:
38 timestamp = self._get_timestamp()
39
40 if timestamp < self.last_timestamp:
41 raise ValueError("ساعت به عقب حرکت کرده است. از تولید شناسه خودداری میشود")
42
43 if timestamp == self.last_timestamp:
44 self.sequence = (self.sequence + 1) & self.sequence_mask
45 if self.sequence == 0:
46 timestamp = self._til_next_millis(self.last_timestamp)
47 else:
48 self.sequence = 0
49
50 self.last_timestamp = timestamp
51
52 return ((timestamp - self.epoch) << self.timestamp_left_shift) | \
53 (self.datacenter_id << self.datacenter_id_shift) | \
54 (self.worker_id << self.worker_id_shift) | \
55 self.sequence
56
57## استفاده
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"شناسه اسنوفلیک تولید شده: {snowflake_id}")
61
1import java.util.concurrent.locks.Lock;
2import java.util.concurrent.locks.ReentrantLock;
3
4public class SnowflakeGenerator {
5 private final long epoch;
6 private final long datacenterIdBits;
7 private final long workerIdBits;
8 private final long sequenceBits;
9 private final long maxDatacenterId;
10 private final long maxWorkerId;
11 private final long workerIdShift;
12 private final long datacenterIdShift;
13 private final long timestampLeftShift;
14 private final long sequenceMask;
15
16 private long datacenterId;
17 private long workerId;
18 private long sequence = 0L;
19 private long lastTimestamp = -1L;
20
21 private final Lock lock = new ReentrantLock();
22
23 public SnowflakeGenerator(long datacenterId, long workerId) {
24 this.epoch = 1288834974657L;
25 this.datacenterIdBits = 5L;
26 this.workerIdBits = 5L;
27 this.sequenceBits = 12L;
28
29 this.maxDatacenterId = ~(-1L << datacenterIdBits);
30 this.maxWorkerId = ~(-1L << workerIdBits);
31
32 this.workerIdShift = sequenceBits;
33 this.datacenterIdShift = sequenceBits + workerIdBits;
34 this.timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
35 this.sequenceMask = ~(-1L << sequenceBits);
36
37 if (datacenterId > maxDatacenterId || datacenterId < 0) {
38 throw new IllegalArgumentException("شناسه مرکز داده نمیتواند بیشتر از حداکثر شناسه مرکز داده یا کمتر از ۰ باشد");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("شناسه کارگر نمیتواند بیشتر از حداکثر شناسه کارگر یا کمتر از ۰ باشد");
42 }
43 this.datacenterId = datacenterId;
44 this.workerId = workerId;
45 }
46
47 public long nextId() {
48 lock.lock();
49 try {
50 long timestamp = timeGen();
51 if (timestamp < lastTimestamp) {
52 throw new RuntimeException("ساعت به عقب حرکت کرده است. از تولید شناسه خودداری میشود");
53 }
54
55 if (lastTimestamp == timestamp) {
56 sequence = (sequence + 1) & sequenceMask;
57 if (sequence == 0) {
58 timestamp = tilNextMillis(lastTimestamp);
59 }
60 } else {
61 sequence = 0L;
62 }
63
64 lastTimestamp = timestamp;
65
66 return ((timestamp - epoch) << timestampLeftShift) |
67 (datacenterId << datacenterIdShift) |
68 (workerId << workerIdShift) |
69 sequence;
70 } finally {
71 lock.unlock();
72 }
73 }
74
75 private long tilNextMillis(long lastTimestamp) {
76 long timestamp = timeGen();
77 while (timestamp <= lastTimestamp) {
78 timestamp = timeGen();
79 }
80 return timestamp;
81 }
82
83 private long timeGen() {
84 return System.currentTimeMillis();
85 }
86
87 public static void main(String[] args) {
88 SnowflakeGenerator generator = new SnowflakeGenerator(1, 1);
89 long id = generator.nextId();
90 System.out.println("شناسه اسنوفلیک تولید شده: " + id);
91 }
92}
93
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
ابزارهای مرتبط
کشف ابزارهای بیشتری که ممکن است برای جریان کاری شما مفید باشند