شناسههای برفراز توییتر را تولید و تحلیل کنید، شناسههای منحصر به فرد ۶۴ بیتی که در سیستمهای توزیعشده استفاده میشوند. این ابزار به شما امکان میدهد شناسههای برفراز جدید ایجاد کنید و شناسههای موجود را تجزیه و تحلیل کنید و بینشهایی درباره اجزای زمانسنج، شناسه ماشین و شماره توالی آنها ارائه میدهد.
یک تولیدکننده شناسه اسنوفلیک شناسههای منحصر به فردی برای سیستمهای توزیعشده ایجاد میکند که در ابتدا توسط توییتر برای مدیریت پردازش دادههای مقیاس بزرگ توسعه یافته است. این تولیدکننده شناسه منحصر به فرد قدرتمند، اعداد صحیح ۶۴ بیتی تولید میکند که از یک زمانسنج، شناسه ماشین و شماره توالی تشکیل شده است و منحصر به فرد بودن در سیستمهای توزیعشده را بدون نیاز به هماهنگی بین سرورها تضمین میکند.
ابزار آنلاین رایگان تولیدکننده شناسه اسنوفلیک ما به شما این امکان را میدهد که بهطور فوری شناسههای اسنوفلیک را تولید و تجزیه کنید، که آن را برای توسعهدهندگان کار با میکروسرویسها، پایگاههای داده توزیعشده و برنامههای با توان بالا ایدهآل میسازد.
شناسههای اسنوفلیک اعداد صحیح ۶۴ بیتی با ساختاری بهدقت طراحیشده هستند که منحصر به فرد بودن را تضمین میکند:
این ساختار شناسه توزیعشده امکان تولید تقریباً ۴,۰۹۶ شناسه منحصر به فرد در هر میلیثانیه برای هر ماشین را فراهم میکند و آن را برای سیستمهای توزیعشده با توان بالا ایدهآل میسازد.
برای تولید شناسههای منحصر به فرد اسنوفلیک این مراحل ساده را دنبال کنید:
برای کدگشایی یک شناسه اسنوفلیک، آن را در فیلد "تجزیه شناسه" وارد کنید و روی "تجزیه" کلیک کنید تا زمانسنج، شناسه ماشین و اجزای توالی آن را ببینید.
الگوریتم شناسه اسنوفلیک شناسههای منحصر به فرد را با استفاده از عملیات بیتی ایجاد میکند:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
اجزای فرمول:
timestamp
: تعداد میلیثانیهها از اپوکdatacenterId
: عدد صحیح ۵ بیتی (۰-۳۱) که مرکز داده را شناسایی میکندworkerId
: عدد صحیح ۵ بیتی (۰-۳۱) که ماشین کارگر را شناسایی میکندsequence
: عدد صحیح ۱۲ بیتی (۰-۴۰۹۵) برای چندین شناسه در هر میلیثانیهالگوریتم تولید شناسه اسنوفلیک این مراحل دقیق را دنبال میکند:
این فرآیند شناسههای بهطور مداوم در حال افزایش را در هر ماشین تضمین میکند در حالی که منحصر به فرد بودن جهانی را در سیستمهای توزیعشده حفظ میکند.
شناسههای اسنوفلیک در سناریوهای مختلف محاسبات توزیعشده عالی هستند:
در حالی که شناسههای اسنوفلیک قدرتمند هستند، سیستمهای دیگر تولید شناسه منحصر به فرد شامل:
درک محدودیتهای شناسه اسنوفلیک به پیادهسازی صحیح کمک میکند:
شناسههای اسنوفلیک در سال ۲۰۱۰ توسط توییتر معرفی شدند تا چالش تولید شناسههای منحصر به فرد توزیعشده و قابل مرتبسازی بر اساس زمان را در مقیاس بزرگ حل کنند. با افزایش سریع تعداد کاربران و حجم توییتها در توییتر، شناسههای خودافزایشی سنتی برای معماری توزیعشده آنها کافی نبودند.
این سیستم از آن زمان توسط شرکتهای بزرگ فناوری از جمله اینستاگرام، دیسکورد و بیشماری دیگر از پلتفرمها که نیاز به تولید شناسه مقیاسپذیر برای سیستمهای توزیعشده دارند، پذیرفته شده است.
پیادهسازی تولید شناسه اسنوفلیک در زبان برنامهنویسی مورد نظر خود:
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
کشف ابزارهای بیشتری که ممکن است برای جریان کاری شما مفید باشند