Zana ya Kutengeneza na Kuchambua Twitter Snowflake ID kwa Maelezo
Tengeneza na uchambue Twitter Snowflake IDs, vitambulisho vya kipekee vya 64-bit vinavyotumika katika mifumo iliyosambazwa. Zana hii inakuwezesha kuunda Snowflake IDs mpya na kuchambua zile zilizopo, ikitoa maelezo kuhusu muda wao, kitambulisho cha mashine, na vipengele vya nambari ya mfuatano.
Mwanasheria wa ID ya Snowflake
Mwanasheria wa ID ya Snowflake
Nyaraka
Snowflake ID Generator: Unda Unique Distributed System Identifiers
Nini Snowflake ID Generator?
Snowflake ID generator inaunda vitambulisho vya kipekee kwa mifumo iliyosambazwa, ambayo awali ilitengenezwa na Twitter kwa ajili ya kushughulikia usindikaji wa data kwa kiwango kikubwa. Huu ni generator wa ID wa kipekee unaozalisha nambari za 64-bit zinazojumuisha alama ya muda, ID ya mashine, na nambari ya mfuatano, kuhakikisha upekee katika mifumo iliyosambazwa bila uratibu kati ya seva.
Zana yetu ya bure ya mtandaoni ya Snowflake ID generator inakuwezesha kuunda na kuchambua Snowflake IDs mara moja, na kuifanya kuwa bora kwa wabunifu wanaofanya kazi na microservices, hifadhidata zilizotawanywa, na programu zenye kiwango cha juu cha kupitia.
Jinsi Snowflake ID Generation Inavyofanya Kazi
Snowflake IDs ni nambari za 64-bit zenye muundo ulioandaliwa kwa makini ambao unahakikisha upekee:
- 41 bits: Alama ya muda (millisecond tangu enzi maalum)
- 10 bits: ID ya Mashine (5 bits kwa ID ya kituo cha data, 5 bits kwa ID ya mfanyakazi)
- 12 bits: Nambari ya mfuatano
Muundo huu wa ID iliyosambazwa unaruhusu uzalishaji wa takriban 4,096 IDs za kipekee kwa millisecond kwa kila mashine, na kuifanya kuwa bora kwa mifumo iliyosambazwa yenye kiwango cha juu cha kupitia.
Jinsi ya Kutumia Zana Yetu ya Snowflake ID Generator
Fuata hatua hizi rahisi ili kuunda Snowflake IDs za kipekee:
- Weka Enzi Maalum (Hiari): Tumia enzi ya kawaida ya Twitter (2010-11-04T01:42:54.657Z) au weka yako mwenyewe
- Sanidi IDs za Mashine: Ingiza ID ya mashine (0-31) na ID ya kituo cha data (0-31)
- Unda ID: Bonyeza "Unda" ili kuunda Snowflake ID mpya ya kipekee
- Tazama Matokeo: Angalia ID iliyoundwa na ufafanuzi wa vipengele vyake
Parse Snowflake IDs Zilizopo
Ili kufasiri Snowflake ID, ingiza katika uwanja wa "Parse ID" na bonyeza "Parse" ili kuona alama yake ya muda, ID ya mashine, na vipengele vya mfuatano.
Msingi wa Snowflake ID Generation
Algorithimu ya Snowflake ID inajenga vitambulisho vya kipekee kwa kutumia operesheni za bitwise:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
Vipengele vya Msingi:
timestamp
: Idadi ya milliseconds tangu enzidatacenterId
: Nambari ya 5-bit (0-31) inayotambulisha kituo cha dataworkerId
: Nambari ya 5-bit (0-31) inayotambulisha mashine ya mfanyakazisequence
: Nambari ya 12-bit (0-4095) kwa IDs nyingi kwa millisecond
Mchakato wa Hesabu ya Snowflake ID
Algorithimu ya uzalishaji wa Snowflake ID inafuata hatua hizi sahihi:
- Pata Alama ya Muda ya Sasa: Pata wakati wa sasa kwa milliseconds
- Hakikisha Mpangilio wa Kihistoria: Thibitisha alama ya muda inazidi alama ya muda iliyotumika mwisho
- Shughulikia Alama ya Muda Ile Ile: Ikiwa alama ya muda inalingana na ya awali, ongeza nambari ya mfuatano
- Kinga Overflow: Ikiwa mfuatano unafikia 4096, subiri millisecond inayofuata
- Changanya Vipengele: Tumia operesheni za bitwise kuunda ID ya mwisho ya kipekee
Mchakato huu unahakikisha IDs zinazoongezeka kwa mpangilio ndani ya kila mashine huku ukihifadhi upekee wa kimataifa katika mifumo iliyosambazwa.
Matumizi na Maombi ya Snowflake ID
Snowflake IDs zinafanikiwa katika hali mbalimbali za kompyuta zilizotawanywa:
Matumizi Makuu
- Mifumo Iliyosambazwa: Unda IDs za kipekee katika mashine nyingi bila uratibu
- Usindikaji wa Data kwa Kiwango Kikubwa: Unda IDs zinazoweza kupangwa kwa seti kubwa za data
- Msingi wa Microservices: Hakikisha vitambulisho vya kipekee kati ya huduma tofauti
- Kugawanya Hifadhidata: Tumia vipengele vya alama ya muda au ID ya mashine kwa kugawanya data kwa ufanisi
Maombi ya Ukweli
- Majukwaa ya Mitandao ya Kijamii: Twitter, Instagram kwa IDs za machapisho na watumiaji
- Mifumo ya Biashara Mtandaoni: Ufuatiliaji wa maagizo na usimamizi wa akiba
- Kukusanya Data za IoT: Kurekodi matukio ya vifaa na data za sensorer
- Mifumo ya Fedha: Usindikaji wa miamala na nyaraka za ukaguzi
Mbadala wa Snowflake ID na Mlinganisho
Ingawa Snowflake IDs ni zenye nguvu, mifumo mingine ya uzalishaji wa ID wa kipekee ni pamoja na:
Mifumo ya ID Mbadala
- UUID (Universally Unique Identifier): Bora kwa uzalishaji wa kusambazwa bila mahitaji ya kupangwa
- IDs za Hifadhidata Zinazojiendeleza: Suluhisho rahisi lililozuiliwa kwa mifumo ya hifadhidata moja
- ULID (Universally Unique Lexicographically Sortable Identifier): Inafanana na Snowflake na uandishi wa base32
- NanoID: Generator ya nyuzi za kipekee salama kwa URL kwa ajili ya programu za wavuti
Mipaka na Maoni ya Snowflake ID
Kuelewa mipaka ya Snowflake ID husaidia katika utekelezaji sahihi:
Changamoto za Kawaida
- Masuala ya Usawazishaji wa Saa: Kutegemea wakati wa mfumo kunaweza kusababisha matatizo na marekebisho ya NTP au mabadiliko ya wakati wa majira
- Mipaka ya Mwaka 2079: Overflow ya alama ya muda ya 41-bit inahitaji mipango ya muda mrefu kwa mifumo ya kiwango kikubwa
- Usimamizi wa ID za Mashine: Kuhakikisha IDs za mashine za kipekee katika mifumo mikubwa iliyosambazwa kunahitaji uratibu
- Overflow ya Mfuatano: Hali za kiwango cha juu cha kupitia zinaweza kuchoma mfuatano wa 4096 kwa millisecond
- Mpangilio wa Kati ya Mashine: IDs ni monotonic kwa kila mashine lakini si kimataifa kati ya mashine zote
Historia ya Snowflake IDs
Snowflake IDs zilianzishwa na Twitter mwaka 2010 ili kutatua changamoto ya kuunda vitambulisho vya kipekee, vinavyoweza kupangwa kwa wakati katika kiwango kikubwa. Kadri idadi ya watumiaji wa Twitter na kiasi cha tweets kilivyoongezeka, IDs za kawaida za kujiendeleza zilikuwa hazitoshi kwa usanifu wao wa kusambazwa.
Mfumo huu tangu wakati huo umekubaliwa na kampuni kubwa za teknolojia ikiwa ni pamoja na Instagram, Discord, na majukwaa mengine mengi yanayohitaji uzalishaji wa ID unaoweza kupanuka kwa mifumo iliyosambazwa.
Mifano ya Kanuni ya Snowflake ID Generator
Tekeleza uzalishaji wa Snowflake ID katika lugha yako ya programu unayopendelea:
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('Clock moved backwards. Refusing to generate 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// Matumizi
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generated 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("Clock moved backwards. Refusing to generate 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## Matumizi
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"Generated 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 can't be greater than maxDatacenterId or less than 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId can't be greater than maxWorkerId or less than 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("Clock moved backwards. Refusing to generate 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("Generated 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 'Clock moved backwards' 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## Matumizi
54generator = SnowflakeGenerator.new(1, 1)
55snowflake_id = generator.next_id
56puts "Generated Snowflake ID: #{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 $dat
Zana Zinazohusiana
Gundua zana zaidi ambazo zinaweza kuwa na manufaa kwa mtiririko wako wa kazi