Alat untuk Menghasilkan dan Menganalisis ID Snowflake Twitter untuk Wawasan
Hasilkan dan analisis ID Snowflake Twitter, pengidentifikasi unik 64-bit yang digunakan dalam sistem terdistribusi. Alat ini memungkinkan Anda untuk membuat ID Snowflake baru dan mengurai yang sudah ada, memberikan wawasan tentang komponen timestamp, ID mesin, dan nomor urutnya.
Generator ID Snowflake
Generator ID Snowflake
Dokumentasi
Generator ID Snowflake: Buat Identifikasi Sistem Terdistribusi yang Unik
Apa itu Generator ID Snowflake?
Generator ID Snowflake menciptakan pengenal unik untuk sistem terdistribusi, awalnya dikembangkan oleh Twitter untuk menangani pemrosesan data berskala besar. Generator ID unik yang kuat ini menghasilkan bilangan bulat 64-bit yang terdiri dari timestamp, ID mesin, dan nomor urut, memastikan keunikan di seluruh sistem terdistribusi tanpa koordinasi antara server.
Alat generator ID Snowflake online gratis kami memungkinkan Anda untuk menghasilkan dan mengurai ID Snowflake secara instan, menjadikannya sempurna untuk pengembang yang bekerja dengan mikroservis, basis data terdistribusi, dan aplikasi throughput tinggi.
Cara Kerja Generasi ID Snowflake
ID Snowflake adalah bilangan bulat 64-bit dengan struktur yang dirancang dengan cermat yang menjamin keunikan:
- 41 bit: Timestamp (milidetik sejak epoch kustom)
- 10 bit: ID Mesin (5 bit untuk ID pusat data, 5 bit untuk ID pekerja)
- 12 bit: Nomor Urut
Struktur ID terdistribusi ini memungkinkan generasi sekitar 4.096 ID unik per milidetik per mesin, menjadikannya ideal untuk sistem terdistribusi dengan throughput tinggi.
Cara Menggunakan Alat Generator ID Snowflake Kami
Ikuti langkah-langkah sederhana ini untuk menghasilkan ID Snowflake yang unik:
- Atur Epoch Kustom (Opsional): Gunakan epoch default Twitter (2010-11-04T01:42:54.657Z) atau atur milik Anda sendiri
- Konfigurasi ID Mesin: Masukkan ID mesin (0-31) dan ID pusat data (0-31)
- Hasilkan ID: Klik "Hasilkan" untuk membuat ID Snowflake unik yang baru
- Lihat Hasil: Lihat ID yang dihasilkan dan rincian komponennya
Mengurai ID Snowflake yang Ada
Untuk mengurai ID Snowflake, masukkan di kolom "Parse ID" dan klik "Parse" untuk melihat timestamp, ID mesin, dan komponen urutnya.
Rumus Generasi ID Snowflake
Algoritma ID Snowflake membangun pengenal unik menggunakan operasi bitwise:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
Komponen Rumus:
timestamp
: Jumlah milidetik sejak epochdatacenterId
: Bilangan bulat 5-bit (0-31) yang mengidentifikasi pusat dataworkerId
: Bilangan bulat 5-bit (0-31) yang mengidentifikasi mesin pekerjasequence
: Bilangan bulat 12-bit (0-4095) untuk beberapa ID per milidetik
Proses Perhitungan ID Snowflake
Algoritma generasi ID Snowflake mengikuti langkah-langkah yang tepat ini:
- Dapatkan Timestamp Saat Ini: Ambil waktu saat ini dalam milidetik
- Pastikan Urutan Kronologis: Verifikasi timestamp melebihi timestamp terakhir yang digunakan
- Tangani Timestamp yang Sama: Jika timestamp cocok dengan sebelumnya, tingkatkan nomor urut
- Cegah Overflow: Jika urut mencapai 4096, tunggu milidetik berikutnya
- Gabungkan Komponen: Gunakan operasi bitwise untuk membuat ID unik akhir
Proses ini menjamin ID yang meningkat monoton dalam setiap mesin sambil mempertahankan keunikan global di seluruh sistem terdistribusi.
Kasus Penggunaan dan Aplikasi ID Snowflake
ID Snowflake unggul dalam berbagai skenario komputasi terdistribusi:
Kasus Penggunaan Utama
- Sistem Terdistribusi: Menghasilkan ID unik di seluruh beberapa mesin tanpa koordinasi
- Pemrosesan Data Volume Tinggi: Membuat ID yang dapat diurutkan untuk dataset besar
- Arsitektur Mikroservis: Memastikan pengenal unik di seluruh layanan yang berbeda
- Sharding Basis Data: Menggunakan komponen timestamp atau ID mesin untuk pemartisian data yang efisien
Aplikasi Dunia Nyata
- Platform Media Sosial: Twitter, Instagram untuk ID pos dan pengguna
- Sistem E-commerce: Pelacakan pesanan dan manajemen inventaris
- Pengumpulan Data IoT: Pencatatan peristiwa perangkat dan data sensor
- Sistem Keuangan: Pemrosesan transaksi dan jejak audit
Alternatif dan Perbandingan ID Snowflake
Meskipun ID Snowflake kuat, sistem generasi ID unik lainnya meliputi:
Sistem ID Alternatif
- UUID (Identifikasi Unik Universal): Terbaik untuk generasi terdistribusi tanpa persyaratan keterurutan
- ID Basis Data Auto-increment: Solusi sederhana yang terbatas pada instansi basis data tunggal
- ULID (Identifikasi Unik Secara Lexicographically Dapat Diurutkan): Mirip dengan Snowflake dengan pengkodean base32
- NanoID: Generator string unik yang kompak dan aman untuk URL untuk aplikasi web
Keterbatasan dan Pertimbangan ID Snowflake
Memahami keterbatasan ID Snowflake membantu dalam implementasi yang tepat:
Tantangan Umum
- Masalah Sinkronisasi Jam: Ketergantungan waktu sistem dapat menyebabkan masalah dengan penyesuaian NTP atau perubahan waktu musim panas
- Keterbatasan Tahun 2079: Overflow timestamp 41-bit memerlukan perencanaan jangka panjang untuk sistem berskala tinggi
- Manajemen ID Mesin: Memastikan ID mesin yang unik di seluruh sistem terdistribusi besar memerlukan koordinasi
- Overflow Urut: Skenario throughput yang sangat tinggi dapat menghabiskan 4096 urut per milidetik
- Urutan Lintas Mesin: ID bersifat monoton per mesin tetapi tidak secara global di seluruh mesin
Sejarah ID Snowflake
ID Snowflake diperkenalkan oleh Twitter pada tahun 2010 untuk mengatasi tantangan menghasilkan pengenal unik yang terdistribusi dan dapat diurutkan berdasarkan waktu dalam skala besar. Seiring dengan meledaknya basis pengguna dan volume tweet Twitter, ID auto-increment tradisional menjadi tidak memadai untuk arsitektur terdistribusi mereka.
Sistem ini sejak itu diadopsi oleh perusahaan teknologi besar termasuk Instagram, Discord, dan banyak platform lain yang memerlukan generasi ID yang dapat diskalakan untuk sistem terdistribusi.
Contoh Kode Generator ID Snowflake
Implementasikan generasi ID Snowflake dalam bahasa pemrograman 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 mundur. 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 mundur. 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 dari maxDatacenterId atau kurang dari 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId tidak boleh lebih besar dari maxWorkerId atau kurang dari 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 mundur. 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 mundur' 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 dari maxDatacenterId atau kurang dari 0"); } if ($workerId > $this->maxWorkerId || $workerId < 0) { throw new Exception("workerId tidak boleh lebih besar dari maxWorkerId atau kurang dari 0"); } $this->datacenterId = $datacenterId; $this->workerId = $workerId; } public function nextId() { $timestamp = $
Alat Terkait
Temukan lebih banyak alat yang mungkin berguna untuk alur kerja Anda