Hasilkan dan Analisis Alat ID Snowflake Twitter untuk Wawasan
Hasilkan dan analisis ID Snowflake Twitter, pengenalan unik 64-bit yang digunakan dalam sistem teragih. Alat ini membolehkan anda mencipta ID Snowflake baru dan menguraikan yang sedia ada, memberikan wawasan tentang komponen cap waktu, ID mesin, dan nombor urutan mereka.
Penjana ID Snowflake
Penjana ID Snowflake
Dokumentasi
Penjana ID Snowflake: Cipta Pengenal Sistem Teragih yang Unik
Apa itu Penjana ID Snowflake?
Penjana ID Snowflake mencipta pengenal unik untuk sistem teragih, yang asalnya dibangunkan oleh Twitter untuk mengendalikan pemprosesan data berskala besar. Penjana ID unik yang berkuasa ini menghasilkan integer 64-bit yang terdiri daripada cap waktu, ID mesin, dan nombor urutan, memastikan keunikan merentasi sistem teragih tanpa memerlukan koordinasi antara pelayan.
Alat penjana ID Snowflake dalam talian percuma kami membolehkan anda menghasilkan dan menganalisis ID Snowflake dengan serta-merta, menjadikannya sempurna untuk pembangun yang bekerja dengan mikroservis, pangkalan data teragih, dan aplikasi throughput tinggi.
Cara Penjanaan ID Snowflake Berfungsi
ID Snowflake adalah integer 64-bit dengan struktur yang direka dengan teliti yang menjamin keunikan:
- 41 bit: Cap waktu (milisaat sejak epoch khusus)
- 10 bit: ID Mesin (5 bit untuk ID pusat data, 5 bit untuk ID pekerja)
- 12 bit: Nombor urutan
Struktur ID teragih ini membolehkan penghasilan kira-kira 4,096 ID unik per milisaat per mesin, menjadikannya ideal untuk sistem teragih throughput tinggi.
Cara Menggunakan Alat Penjana ID Snowflake Kami
Ikuti langkah-langkah mudah ini untuk menghasilkan ID Snowflake yang unik:
- Tetapkan Epoch Khusus (Pilihan): Gunakan epoch Twitter lalai (2010-11-04T01:42:54.657Z) atau tetapkan yang anda sendiri
- Konfigurasikan ID Mesin: Masukkan ID mesin (0-31) dan ID pusat data (0-31)
- Hasilkan ID: Klik "Hasilkan" untuk mencipta ID Snowflake unik yang baru
- Lihat Hasil: Lihat ID yang dihasilkan dan pecahan komponennya
Menganalisis ID Snowflake yang Sedia Ada
Untuk menguraikan ID Snowflake, masukkan dalam medan "Uraikan ID" dan klik "Uraikan" untuk melihat komponen cap waktu, ID mesin, dan urutan.
Formula Penjanaan ID Snowflake
Algoritma ID Snowflake membina pengenal unik menggunakan operasi bitwise:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
Komponen Formula:
timestamp
: Bilangan milisaat sejak epochdatacenterId
: Integer 5-bit (0-31) yang mengenal pasti pusat dataworkerId
: Integer 5-bit (0-31) yang mengenal pasti mesin pekerjasequence
: Integer 12-bit (0-4095) untuk pelbagai ID per milisaat
Proses Pengiraan ID Snowflake
Algoritma penjanaan ID Snowflake mengikuti langkah-langkah tepat ini:
- Dapatkan Cap Waktu Semasa: Ambil masa semasa dalam milisaat
- Pastikan Susunan Kronologi: Sahkan cap waktu melebihi cap waktu terakhir yang digunakan
- Tangani Cap Waktu yang Sama: Jika cap waktu sepadan dengan yang sebelumnya, tingkatkan nombor urutan
- Cegah Overflow: Jika urutan mencapai 4096, tunggu milisaat seterusnya
- Gabungkan Komponen: Gunakan operasi bitwise untuk mencipta ID unik akhir
Proses ini menjamin ID yang meningkat secara monoton dalam setiap mesin sambil mengekalkan keunikan global merentasi sistem teragih.
Kes Penggunaan dan Aplikasi ID Snowflake
ID Snowflake cemerlang dalam pelbagai senario pengkomputeran teragih:
Kes Penggunaan Utama
- Sistem Teragih: Hasilkan ID unik merentasi pelbagai mesin tanpa koordinasi
- Pemprosesan Data Bervolume Tinggi: Cipta ID yang boleh disusun untuk set data besar
- Arsitektur Mikroservis: Pastikan pengenal unik merentasi pelbagai perkhidmatan
- Pecahan Pangkalan Data: Gunakan komponen cap waktu atau ID mesin untuk pengagihan data yang efisien
Aplikasi Dunia Nyata
- Platform Media Sosial: Twitter, Instagram untuk ID pos dan pengguna
- Sistem E-dagang: Penjejakan pesanan dan pengurusan inventori
- Pengumpulan Data IoT: Pencatatan acara peranti dan data sensor
- Sistem Kewangan: Pemprosesan transaksi dan jejak audit
Alternatif dan Perbandingan ID Snowflake
Walaupun ID Snowflake berkuasa, sistem penjanaan ID unik lain termasuk:
Sistem ID Alternatif
- UUID (Pengenal Unik Sejagat): Terbaik untuk penjanaan teragih tanpa keperluan untuk disusun
- ID Pangkalan Data Auto-increment: Penyelesaian mudah yang terhad kepada instans pangkalan data tunggal
- ULID (Pengenal Unik Sejagat yang Boleh Disusun Secara Lexicographically): Serupa dengan Snowflake dengan pengekodan base32
- NanoID: Penjana string unik yang padat dan selamat untuk URL bagi aplikasi web
Had dan Pertimbangan ID Snowflake
Memahami had ID Snowflake membantu dalam pelaksanaan yang betul:
Cabaran Umum
- Isu Penyelarasan Jam: Kebergantungan masa sistem boleh menyebabkan masalah dengan pelarasan NTP atau perubahan waktu siang
- Had Tahun 2079: Overflow cap waktu 41-bit memerlukan perancangan jangka panjang untuk sistem berskala tinggi
- Pengurusan ID Mesin: Memastikan ID mesin yang unik merentasi sistem teragih yang besar memerlukan koordinasi
- Overflow Urutan: Senario throughput yang sangat tinggi mungkin menghabiskan 4096 urutan per milisaat
- Susunan Merentasi Mesin: ID adalah monoton bagi setiap mesin tetapi tidak secara global merentasi semua mesin
Sejarah ID Snowflake
ID Snowflake diperkenalkan oleh Twitter pada tahun 2010 untuk menyelesaikan cabaran menghasilkan pengenal unik yang teragih dan boleh disusun mengikut waktu pada skala besar. Ketika jumlah pengguna dan volume tweet Twitter meledak, ID auto-increment tradisional menjadi tidak mencukupi untuk seni bina teragih mereka.
Sistem ini telah diambil oleh syarikat teknologi utama termasuk Instagram, Discord, dan banyak platform lain yang memerlukan penjanaan ID yang boleh diskala untuk sistem teragih.
Contoh Kod Penjana ID Snowflake
Laksanakan penjanaan ID Snowflake dalam bahasa pengaturcaraan pilihan anda:
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('Jam bergerak ke belakang. Menolak untuk menghasilkan 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// Penggunaan
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`ID Snowflake yang dihasilkan: ${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("Jam bergerak ke belakang. Menolak untuk menghasilkan id")
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## Penggunaan
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"ID Snowflake yang dihasilkan: {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("datacenterId tidak boleh lebih besar daripada maxDatacenterId atau kurang daripada 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId tidak boleh lebih besar daripada maxWorkerId atau kurang daripada 0");
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("Jam bergerak ke belakang. Menolak untuk menghasilkan id");
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 Snowflake yang dihasilkan: " + id);
91 }
92}
93
1require 'time'
2
3class SnowflakeGenerator
4 def initialize(datacenter_id, worker_id, sequence = 0)
5 @datacenter_id = datacenter_id
6 @worker_id = worker_id
7 @sequence = sequence
8 @last_timestamp = -1
9 @epoch = 1288834974657
10
11 @datacenter_id_bits = 5
12 @worker_id_bits = 5
13 @sequence_bits = 12
14
15 @max_datacenter_id = -1 ^ (-1 << @datacenter_id_bits)
16 @max_worker_id = -1 ^ (-1 << @worker_id_bits)
17
18 @worker_id_shift = @sequence_bits
19 @datacenter_id_shift = @sequence_bits + @worker_id_bits
20 @timestamp_left_shift = @sequence_bits + @worker_id_bits + @datacenter_id_bits
21 @sequence_mask = -1 ^ (-1 << @sequence_bits)
22 end
23
24 def next_id
25 timestamp = (Time.now.to_f * 1000).to_i
26
27 raise 'Jam bergerak ke belakang' if timestamp < @last_timestamp
28
29 if timestamp == @last_timestamp
30 @sequence = (@sequence + 1) & @sequence_mask
31 timestamp = til_next_millis(@last_timestamp) if @sequence == 0
32 else
33 @sequence = 0
34 end
35
36 @last_timestamp = timestamp
37
38 ((timestamp - @epoch) << @timestamp_left_shift) |
39 (@datacenter_id << @datacenter_id_shift) |
40 (@worker_id << @worker_id_shift) |
41 @sequence
42 end
43
44 private
45
46 def til_next_millis(last_timestamp)
47 timestamp = (Time.now.to_f * 1000).to_i
48 timestamp = (Time.now.to_f * 1000).to_i while timestamp <= last_timestamp
49 timestamp
50 end
51end
52
53## Penggunaan
54generator = SnowflakeGenerator.new(1, 1)
55snowflake_id = generator.next_id
56puts "ID Snowflake yang dihasilkan: #{snowflake_id}"
57
<?php class SnowflakeGenerator { private $epoch; private $datacenterIdBits; private $workerIdBits; private $sequenceBits; private $maxDatacenterId; private $maxWorkerId; private $workerIdShift; private $datacenterIdShift; private $timestampLeftShift; private $sequenceMask; private $datacenterId; private $workerId; private $sequence = 0; private $lastTimestamp = -1; public function __construct($datacenterId, $workerId) { $this->epoch = 1288834974657; $this->datacenterIdBits = 5; $this->workerIdBits = 5; $this->sequenceBits = 12; $this->maxDatacenterId = -1 ^ (-1 << $this->datacenterIdBits); $this->maxWorkerId = -1 ^ (-1 << $this->workerIdBits); $this->workerIdShift = $this->sequenceBits; $this->datacenterIdShift = $this->sequenceBits + $this->workerIdBits; $this->timestampLeftShift = $this->sequenceBits + $this->workerIdBits + $this->datacenterIdBits; $this->sequenceMask = -1 ^ (-1 << $this->sequenceBits); if ($datacenterId > $this->maxDatacenterId || $datacenterId < 0) { throw new Exception("datacenterId tidak boleh lebih besar daripada maxDatacenterId atau kurang daripada 0"); } if ($workerId > $this->maxWorkerId || $workerId < 0) { throw new Exception("workerId tidak boleh
Alat Berkaitan
Temui lebih banyak alat yang mungkin berguna untuk aliran kerja anda