Genereeri ja analüüsi Twitteri Snowflake ID tööriist teadlikkuse saamiseks
Genereeri ja analüüsi Twitteri Snowflake ID-sid, unikaalseid 64-bitiseid identifikaatoreid, mida kasutatakse jaotatud süsteemides. See tööriist võimaldab sul luua uusi Snowflake ID-sid ja analüüsida olemasolevaid, pakkudes teavet nende ajatempli, masina ID ja järjestuse numbri komponentide kohta.
Lumehelbe ID generaator
Lumehelbe ID generaator
Dokumentatsioon
Snowflake ID Generaator: Loo Unikaalsed Jaotatud Süsteemi Identifikaatorid
Mis on Snowflake ID generaator?
Snowflake ID generaator loob unikaalseid identifikaatoreid jaotatud süsteemidele, mille töötas välja Twitter, et hallata massiivset andmete töötlemist. See võimas unikaalne ID generaator toodab 64-bitiseid täisarve, mis koosnevad ajatempost, masina ID-st ja järjestuse numbrist, tagades unikaalsuse jaotatud süsteemide vahel ilma serverite vahelise koordineerimiseta.
Meie tasuta veebipõhine Snowflake ID generaatori tööriist võimaldab teil koostada ja analüüsida Snowflake ID-sid koheselt, muutes selle ideaalseks arendajatele, kes töötavad mikroteenuste, jaotatud andmebaaside ja kõrge läbilaskevõimega rakendustega.
Kuidas Snowflake ID genereerimine töötab
Snowflake ID-d on 64-bitised täisarvud, millel on hoolikalt kavandatud struktuur, mis tagab unikaalsuse:
- 41 bitti: Aeg (millisekundid alates kohandatud ajast)
- 10 bitti: Masina ID (5 bitti andmekeskuse ID jaoks, 5 bitti töötaja ID jaoks)
- 12 bitti: Järjestuse number
See jaotatud ID struktuur võimaldab genereerida umbes 4,096 unikaalset ID-d millisekundi kohta masina kohta, muutes selle ideaalseks kõrge läbilaskevõimega jaotatud süsteemide jaoks.
Kuidas kasutada meie Snowflake ID generaatori tööriista
Järgige neid lihtsaid samme, et genereerida unikaalseid Snowflake ID-sid:
- Seadistage kohandatud ajastu (valikuline): Kasutage vaikimisi Twitteri ajastut (2010-11-04T01:42:54.657Z) või seadistage oma
- Konfigureerige masina ID-d: Sisestage masina ID (0-31) ja andmekeskuse ID (0-31)
- Genereerige ID: Klõpsake "Genereeri", et luua uus unikaalne Snowflake ID
- Vaadake tulemusi: Vaadake genereeritud ID-d ja selle koostisosade jaotust
Analüüsige olemasolevaid Snowflake ID-sid
Dekodeerimiseks Snowflake ID-d sisestage see "Analüüsi ID" väljale ja klõpsake "Analüüsi", et näha selle ajatemplit, masina ID-d ja järjestuse komponente.
Snowflake ID genereerimise valem
Snowflake ID algoritm koostab unikaalsed identifikaatorid bititasemel operatsioonide abil:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
Valemi komponendid:
timestamp
: Millisekundite arv alates ajastdatacenterId
: 5-bitine täisarv (0-31), mis tuvastab andmekeskuseworkerId
: 5-bitine täisarv (0-31), mis tuvastab töötava masinasequence
: 12-bitine täisarv (0-4095) mitme ID jaoks millisekundi kohta
Snowflake ID arvutamise protsess
Snowflake ID genereerimise algoritm järgib neid täpseid samme:
- Hankige praegune ajatemperatuur: Hankige praegune aeg millisekundites
- Tagage kronoloogiline järjekord: Kontrollige, kas ajatemperatuur ületab viimati kasutatud ajatemperatuuri
- Käsitlege sama ajatemperatuuri: Kui ajatemperatuur vastab eelnevale, suurendage järjestuse numbrit
- Vältige ülevoolu: Kui järjestus jõuab 4096, oodake järgmist millisekundit
- Kombineerige komponendid: Kasutage bititasemel operatsioone, et luua lõplik unikaalne ID
See protsess tagab monotoonselt kasvavad ID-d iga masina sees, säilitades samal ajal globaalset unikaalsust jaotatud süsteemide vahel.
Snowflake ID kasutusjuhtumid ja rakendused
Snowflake ID-d on suurepärased erinevates jaotatud arvutamise stsenaariumides:
Peamised kasutusjuhtumid
- Jaotatud süsteemid: Genereerige unikaalsed ID-d mitme masina vahel ilma koordineerimiseta
- Suure mahuga andmete töötlemine: Looge sorteeritavad ID-d massiivsete andmekogumite jaoks
- Mikroteenuste arhitektuur: Tagage unikaalsed identifikaatorid erinevate teenuste vahel
- Andmebaasi jagamine: Kasutage ajatempli või masina ID komponente tõhusaks andmete jaotamiseks
Reaalmaailma rakendused
- Sotsiaalmeedia platvormid: Twitter, Instagram postituste ja kasutaja ID-de jaoks
- E-kaubanduse süsteemid: Tellimuste jälgimine ja varude haldamine
- IoT andmete kogumine: Seadmest sündmuste logimine ja andurid
- Finantsüsteemid: Tehingute töötlemine ja auditi jäljed
Snowflake ID alternatiivid ja võrdlused
Kuigi Snowflake ID-d on võimsad, sisaldavad teised unikaalse ID genereerimise süsteemid:
Alternatiivsed ID süsteemid
- UUID (Universaalselt Unikaalne Identifikaator): Parim jaotatud genereerimise jaoks ilma sorteerimise nõueteta
- Automaatne suurenev andmebaasi ID: Lihtne lahendus, mis on piiratud ühe andmebaasi instantsiga
- ULID (Universaalselt Unikaalne Leksikograafiliselt Sorteeritav Identifikaator): Sarnane Snowflake'ile base32 kodeeringuga
- NanoID: Kompaktne, URL-ohutu unikaalne stringi generaator veebirakenduste jaoks
Snowflake ID piirangud ja kaalutlused
Snowflake ID piirangute mõistmine aitab õiget rakendamist:
Tavalised väljakutsed
- Kella sünkroniseerimise probleemid: Süsteemi aja sõltuvused võivad põhjustada probleeme NTP kohanduste või suveaja muutustega
- Aasta 2079 piirang: 41-bitine ajatempli ülevool nõuab pikaajalist planeerimist kõrge mahuga süsteemide jaoks
- Masina ID haldamine: Unikaalsete masina ID-de tagamine suurtes jaotatud süsteemides nõuab koordineerimist
- Järjestuse ülevool: Üksikute kõrge läbilaskevõimega stsenaariumid võivad ammendada 4096 järjestust millisekundi kohta
- Masinatevaheline järjekord: ID-d on monotoonsed iga masina kohta, kuid mitte globaalsetes masinates
Snowflake ID ajalugu
Snowflake ID-d tutvustati Twitteris 2010. aastal, et lahendada jaotatud, ajas sorteeritavate unikaalsete identifikaatorite genereerimise väljakutse massiivses mastaabis. Kui Twitteri kasutajaskond ja tweetide maht plahvatas, muutusid traditsioonilised automaatselt suurenevad ID-d nende jaotatud arhitektuuri jaoks ebapiisavaks.
Süsteemi on hiljem omaks võtnud suured tehnoloogiaettevõtted, sealhulgas Instagram, Discord ja arvukad teised platvormid, mis vajavad skaalautuvat ID genereerimist jaotatud süsteemide jaoks.
Snowflake ID generaatori koodinäited
Rakendage Snowflake ID genereerimist oma eelistatud programmeerimiskeeles:
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('Kell liikus tagasi. ID genereerimine keelatud');
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// Kasutamine
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Genereeritud Snowflake ID: ${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("Kell liikus tagasi. ID genereerimine keelatud")
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## Kasutamine
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"Genereeritud Snowflake ID: {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 ei saa olla suurem kui maxDatacenterId või väiksem kui 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId ei saa olla suurem kui maxWorkerId või väiksem kui 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("Kell liikus tagasi. ID genereerimine keelatud");
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("Genereeritud Snowflake ID: " + 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 'Kell liikus tagasi' 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## Kasutamine
54generator = SnowflakeGenerator.new(1, 1)
55snowflake_id = generator.next_id
56puts "Genereeritud Snowflake ID: #{snowflake_id}"
57
<?php class SnowflakeGenerator { private $epoch; private $datacenterIdBits; private $workerIdBits; private $sequenceBits
Seotud tööriistad
Avasta rohkem tööriistu, mis võivad olla kasulikud teie töövoos