Sniega pārslas ID ģenerators un analīze rīks
Ģenerējiet un analizējiet Twitter Sniega pārslas ID, unikālus 64 bitu identifikatorus, kas tiek izmantoti izplatītajās sistēmās. Šis rīks ļauj jums izveidot jaunus Sniega pārslas ID un analizēt esošos, sniedzot ieskatu to laika zīmē, mašīnas ID un secības numura komponentos.
Sniegpārsla ID ģenerators
Sniegpārsla ID ģenerators
Dokumentācija
Snoflake ID ģenerators
Ievads
Snoflake ID ir unikāls identifikators, ko izmanto izplatītajās sistēmās, sākotnēji izstrādājusi Twitter. Šis rīks ļauj ģenerēt un analizēt snoflake ID, kas ir 64 bitu veseli skaitļi, kas sastāv no laika zīmoga, mašīnas ID un secības numura.
Kā darbojas snoflake ID
Snoflake ID ir 64 bitu veseli skaitļi, kuru struktūra ir šāda:
- 41 bits: Laika zīmogs (milisekundes kopš pielāgota laikmeta)
- 10 bits: Mašīnas ID (5 bits datu centra ID, 5 bits darba ID)
- 12 bits: Secības numurs
Šī struktūra ļauj ģenerēt aptuveni 4,096 unikālus ID katrā milisekundē katrai mašīnai.
Snoflake ID ģeneratora izmantošana
- (Pēc izvēles) Iestatiet pielāgotu laikmetu (noklusējums ir Twitter laikmets: 2010-11-04T01:42:54.657Z)
- Ievadiet mašīnas ID (0-31) un datu centra ID (0-31)
- Noklikšķiniet uz "Ģenerēt", lai izveidotu jaunu snoflake ID
- Tiks parādīts ģenerētais ID un tā komponenti
Lai analizētu esošo snoflake ID, ievadiet to laukā "Analizēt ID" un noklikšķiniet uz "Analizēt".
Formula
Snoflake ID tiek konstruēts, izmantojot bitu operācijas:
1ID = (laika_zīmogs << 22) | (datu_centra_ID << 17) | (darba_ID << 12) | secība
2
Kur:
laika_zīmogs
ir milisekundēs kopš laikmetadatu_centra_ID
ir 5 bitu vesels skaitlis (0-31)darba_ID
ir 5 bitu vesels skaitlis (0-31)secība
ir 12 bitu vesels skaitlis (0-4095)
Aprēķins
Snoflake ID ģenerators veic šādas darbības:
- Iegūst pašreizējo laika zīmogu milisekundēs
- Nodrošina, ka laika zīmogs ir lielāks par pēdējo izmantoto laika zīmogu (unikalitātei)
- Ja laika zīmogs ir tāds pats kā iepriekšējais, palielina secības numuru
- Ja secības numurs pārsniedz (sasniedz 4096), gaida nākamo milisekundi
- Apvieno komponentus, izmantojot bitu operācijas, lai izveidotu galīgo ID
Lietošanas gadījumi
Snoflake ID ir īpaši noderīgi:
- Izplatītajās sistēmās: ģenerēt unikālus ID vairākās mašīnās bez koordinācijas
- Augsta apjoma datiem: izveidot kārtotus ID lieliem datu kopām
- Mikroservisos: nodrošināt unikālus identifikatorus dažādām pakalpojumu daļām
- Datu bāzes dalīšanā: izmantot laika zīmoga vai mašīnas ID komponentu efektīvai dalīšanai
Alternatīvas
Lai gan snoflake ID ir jaudīgi, citi ID ģenerēšanas sistēmas ietver:
- UUID (Universāli unikāls identifikators): noderīgs, kad nepieciešama izplatīta ģenerēšana bez kārtotības
- Automātiski pieaugoši datu bāzes ID: vienkārši, bet ierobežoti uz vienas datu bāzes instancēm
- ULID (Universāli unikāli leksikogrāfiski kārtoti identifikatori): līdzīgi snoflake, bet ar citu struktūru
Malu gadījumi un ierobežojumi
-
Pulksteņa sinhronizācija: snoflake ID paļaujas uz sistēmas laiku. Ja pulkstenis atgriežas atpakaļ NTP korekciju vai vasaras laika izmaiņu dēļ, tas var radīt problēmas ID ģenerēšanā.
-
- gada problēma: 41 bitu laika zīmogs pārsniegs 2079. gadā (pieņemot Twitter laikmetu). Sistēmām, kas izmanto snoflake ID, vajadzētu plānot šo iespēju.
-
Mašīnas ID sadursmes: lielās izplatītās sistēmās unikālu mašīnas ID nodrošināšana var būt izaicinājums un var prasīt papildu koordināciju.
-
Secības pārsniegšana: ārkārtīgi augstas caurlaidības scenārijos ir iespējams izsīkt 4096 secības katrā milisekundē, kas potenciāli var izraisīt kavēšanos.
-
Ne-monotonitāte starp mašīnām: Lai gan ID ir monotoniski pieaugoši vienā mašīnā, tie var nebūt stingri monotoni vairākās mašīnās.
Vēsture
Snoflake ID tika ieviesti Twitter 2010. gadā, lai apmierinātu nepieciešamību pēc izplatītiem, laika kārtotiem unikāliem identifikatoriem. Tie kopš tā laika ir pieņemti un pielāgoti daudzu citu uzņēmumu un projektu.
Piemēri
Šeit ir snoflake ID ģeneratoru īstenojumi dažādās valodās:
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('Pulkstenis pārvietojies atpakaļ. Atsakāmies ģenerēt 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// Lietošana
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Ģenerētais snoflake 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("Pulkstenis pārvietojies atpakaļ. Atsakāmies ģenerēt 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## Lietošana
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"Ģenerētais snoflake 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("datu_centra_ID nevar būt lielāks par maksimālo datu centra ID vai mazāks par 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("darba_ID nevar būt lielāks par maksimālo darba ID vai mazāks par 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("Pulkstenis pārvietojies atpakaļ. Atsakāmies ģenerēt 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("Ģenerētais snoflake 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
23 @lock = Mutex.new
24 end
25
26 def next_id
27 @lock.synchronize do
28 timestamp = (Time.now.to_f * 1000).to_i
29
30 raise 'Pulkstenis pārvietojies atpakaļ' if timestamp < @last_timestamp
31
32 if timestamp == @last_timestamp
33 @sequence = (@sequence + 1) & @sequence_mask
34 timestamp = til_next_millis(@last_timestamp) if @sequence == 0
35 else
36 @sequence = 0
37 end
38
39 @last_timestamp = timestamp
40
41 ((timestamp - @epoch) << @timestamp_left_shift) |
42 (@datacenter_id << @datacenter_id_shift) |
43 (@worker_id << @worker_id_shift) |
44 @sequence
45 end
46 end
47
48 private
49
50 def til_next_millis(last_timestamp)
51 timestamp = (Time.now.to_f * 1000).to_i
52 timestamp = (Time.now.to_f * 1000).to_i while timestamp <= last_timestamp
53 timestamp
54 end
55end
56
57## Lietošana
58generator = SnowflakeGenerator.new(1, 1)
59snowflake_id = generator.next_id
60puts "Ģenerētais snoflake ID: #{snowflake_id}"
61
1<?php
2
3class SnowflakeGenerator {
4 private $epoch;
5 private $datacenterIdBits;
6 private $workerIdBits;
7 private $sequenceBits;
8 private $maxDatacenterId;
9 private $maxWorkerId;
10 private $workerIdShift;
11 private $datacenterIdShift;
12 private $timestampLeftShift;
13 private $sequenceMask;
14
15 private $datacenterId;
16 private $workerId;
17 private $sequence = 0;
18 private $lastTimestamp = -1;
19
20 public function __construct($datacenterId, $workerId) {
21 $this->epoch = 1288834974657;
22 $this->datacenterIdBits = 5;
23 $this->workerIdBits = 5;
24 $this->sequenceBits = 12;
25
26 $this->maxDatacenterId = -1 ^ (-1 << $this->datacenterIdBits);
27 $this->maxWorkerId = -1 ^ (-1 << $this->workerIdBits);
28
29 $this->workerIdShift = $this->sequenceBits;
30 $this->datacenterIdShift = $this->sequenceBits + $this->workerIdBits;
31 $this->timestampLeftShift = $this->sequenceBits + $this->workerIdBits + $this->datacenterIdBits;
32 $this->sequenceMask = -1 ^ (-1 << $this->sequenceBits);
33
34 if ($datacenterId > $this->maxDatacenterId || $datacenterId < 0) {
35 throw new Exception("datu_centra_ID nevar būt lielāks par maksimālo datu centra ID vai mazāks par 0");
36 }
37 if ($workerId > $this->maxWorkerId || $workerId < 0) {
38 throw new Exception("darba_ID nevar būt lielāks par maksimālo darba ID vai mazāks par 0");
39 }
40 $this->datacenterId = $datacenterId;
41 $this->workerId = $workerId;
42 }
43
44 public function nextId() {
45 $timestamp = $this->timeGen();
46
47 if ($timestamp < $this->lastTimestamp) {
48 throw new Exception("Pulkstenis pārvietojies atpakaļ. Atsakāmies ģenerēt id");
49 }
50
51 if ($this->lastTimestamp == $timestamp) {
52 $this->sequence = ($this->sequence + 1) & $this->sequenceMask;
53 if ($this->sequence == 0) {
54 $timestamp = $this->tilNextMillis($this->lastTimestamp);
55 }
56 } else {
57 $this->sequence = 0;
58 }
59
60 $this->lastTimestamp = $timestamp;
61
62 return (($timestamp - $this->epoch) << $this->timestampLeftShift) |
63 ($this->datacenterId << $this->datacenterIdShift) |
64 ($this->workerId << $this->workerIdShift) |
65 $this->sequence;
66 }
67
68 private function tilNextMillis($lastTimestamp) {
69 $timestamp = $this->timeGen();
70 while ($timestamp <= $lastTimestamp) {
71 $timestamp = $this->timeGen();
72 }
73 return $timestamp;
74 }
75
76 private function timeGen() {
77 return floor(microtime(true) * 1000);
78 }
79}
80
81// Lietošana
82$generator = new SnowflakeGenerator(1, 1);
83$id = $generator->nextId();
84echo "Ģenerētais snoflake ID: " . $id . "\n";
85
1using System;
2using System.Threading;
3
4public class SnowflakeGenerator
5{
6 private readonly long _epoch;
7 private readonly int _datacenterIdBits;
8 private readonly int _workerIdBits;
9 private readonly int _sequenceBits;
10 private readonly long _maxDatacenterId;
11 private readonly long _maxWorkerId;
12 private readonly int _workerIdShift;
13 private readonly int _datacenterIdShift;
14 private readonly int _timestampLeftShift;
15 private readonly long _sequenceMask;
16
17 private readonly long _datacenterId;
18 private readonly long _workerId;
19 private long _sequence = 0L;
20 private long _lastTimestamp = -1L;
21
22 private readonly object _lock = new object();
23
24 public SnowflakeGenerator(long datacenterId, long workerId)
25 {
26 _epoch = 1288834974657L;
27 _datacenterIdBits = 5;
28 _workerIdBits = 5;
29 _sequenceBits = 12;
30
31 _maxDatacenterId = -1L ^ (-1L << _datacenterIdBits);
32 _maxWorkerId = -1L ^ (-1L << _workerIdBits);
33
34 _workerIdShift = _sequenceBits;
35 _datacenterIdShift = _sequenceBits + _workerIdBits;
36 _timestampLeftShift = _sequenceBits + _workerIdBits + _datacenterIdBits;
37 _sequenceMask = -1L ^ (-1L << _sequenceBits);
38
39 if (datacenterId > _maxDatacenterId || datacenterId < 0)
40 {
41 throw new ArgumentException($"datu_centra_ID nevar būt lielāks par {_maxDatacenterId} vai mazāks par 0");
42 }
43 if (workerId > _maxWorkerId || workerId < 0)
44 {
45 throw new ArgumentException($"darba_ID nevar būt lielāks par {_maxWorkerId} vai mazāks par 0");
46 }
47 _datacenterId = datacenterId;
48 _workerId = workerId;
49 }
50
51 public long NextId()
52 {
53 lock (_lock)
54 {
55 var timestamp = TimeGen();
56
57 if (timestamp < _lastTimestamp)
58 {
59 throw new Exception("Pulkstenis pārvietojies atpakaļ. Atsakāmies ģenerēt id");
60 }
61
62 if (_lastTimestamp == timestamp)
63 {
64 _sequence = (_sequence + 1) & _sequenceMask;
65 if (_sequence == 0)
66 {
67 timestamp = TilNextMillis(_lastTimestamp);
68 }
69 }
70 else
71 {
72 _sequence = 0L;
73 }
74
75 _lastTimestamp = timestamp;
76
77 return ((timestamp - _epoch) << _timestampLeftShift) |
78 (_datacenterId << _datacenterIdShift) |
79 (_workerId << _workerIdShift) |
80 _sequence;
81 }
82 }
83
84 private long TilNextMillis(long lastTimestamp)
85 {
86 var timestamp = TimeGen();
87 while (timestamp <= lastTimestamp)
88 {
89 timestamp = TimeGen();
90 }
91 return timestamp;
92 }
93
94 private long TimeGen()
95 {
96 return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
97 }
98}
99
100// Lietošana
101class Program
102{
103 static void Main(string[] args)
104 {
105 var generator = new SnowflakeGenerator(1, 1);
106 var id = generator.NextId();
107 Console.WriteLine($"Ģenerētais snoflake ID: {id}");
108 }
109}
110
1package main
2
3import (
4 "fmt"
5 "sync"
6 "time"
7)
8
9type SnowflakeGenerator struct {
10 epoch int64
11 datacenterIdBits uint
12 workerIdBits uint
13 sequenceBits uint
14 maxDatacenterId int64
15 maxWorkerId int64
16 workerIdShift uint
17 datacenterIdShift uint
18 timestampLeftShift uint
19 sequenceMask int64
20
21 datacenterId int64
22 workerId int64
23 sequence int64
24 lastTimestamp int64
25
26 lock sync.Mutex
27}
28
29func NewSnowflakeGenerator(datacenterId, workerId int64) (*SnowflakeGenerator, error) {
30 g := &SnowflakeGenerator{
31 epoch: 1288834974657,
32 datacenterIdBits: 5,
33 workerIdBits: 5,
34 sequenceBits: 12,
35 lastTimestamp: -1,
36 }
37
38 g.maxDatacenterId = -1 ^ (-1 << g.datacenterIdBits)
39 g.maxWorkerId = -1 ^ (-1 << g.workerIdBits)
40
41 g.workerIdShift = g.sequenceBits
42 g.datacenterIdShift = g.sequenceBits + g.workerIdBits
43 g.timestampLeftShift = g.sequenceBits + g.workerIdBits + g.datacenterIdBits
44 g.sequenceMask = -1 ^ (-1 << g.sequenceBits)
45
46 if datacenterId > g.maxDatacenterId || datacenterId < 0 {
47 return nil, fmt.Errorf("datu_centra_ID nevar būt lielāks par %d vai mazāks par 0", g.maxDatacenterId)
48 }
49 if workerId > g.maxWorkerId || workerId < 0 {
50 return nil, fmt.Errorf("darba_ID nevar būt lielāks par %d vai mazāks par 0", g.maxWorkerId)
51 }
52 g.datacenterId = datacenterId
53 g.workerId = workerId
54
55 return g, nil
56}
57
58func (g *SnowflakeGenerator) NextId() (int64, error) {
59 g.lock.Lock()
60 defer g.lock.Unlock()
61
62 timestamp := g.timeGen()
63
64 if timestamp < g.lastTimestamp {
65 return 0, fmt.Errorf("pulkstenis pārvietojies atpakaļ, atsakāmies ģenerēt id")
66 }
67
68 if g.lastTimestamp == timestamp {
69 g.sequence = (g.sequence + 1) & g.sequenceMask
70 if g.sequence == 0 {
71 timestamp = g.tilNextMillis(g.lastTimestamp)
72 }
73 } else {
74 g.sequence = 0
75 }
76
77 g.lastTimestamp = timestamp
78
79 return ((timestamp - g.epoch) << g.timestampLeftShift) |
80 (g.datacenterId << g.datacenterIdShift) |
81 (g.workerId << g.workerIdShift) |
82 g.sequence, nil
83}
84
85func (g *SnowflakeGenerator) tilNextMillis(lastTimestamp int64) int64 {
86 timestamp := g.timeGen()
87 for timestamp <= lastTimestamp {
88 timestamp = g.timeGen()
89 }
90 return timestamp
91}
92
93func (g *SnowflakeGenerator) timeGen() int64 {
94 return time.Now().UnixNano() / int64(time.Millisecond)
95}
96
97func main() {
98 generator, err := NewSnowflakeGenerator(1, 1)
99 if err != nil {
100 fmt.Printf("Kļūda, veidojot ģeneratoru: %v\n", err)
101 return
102 }
103
104 id, err := generator.NextId()
105 if err != nil {
106 fmt.Printf("Kļūda, ģenerējot ID: %v\n", err)
107 return
108 }
109
110 fmt.Printf("Ģenerētais snoflake ID: %d\n", id)
111}
112
Diagramma
Šeit ir vizuāla snoflake ID struktūras attēlošana:
Atsauces
- "Snoflake paziņojums." Twitter inženierijas blogs, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
- "Snoflake ID." Vikipēdija, https://en.wikipedia.org/wiki/Snowflake_ID
- "Izplatīta ID ģenerēšana mikroservisos." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f
Atsauksmes
Noklikšķiniet uz atsauksmju tosta, lai sāktu sniegt atsauksmes par šo rīku
Saistītie Rīki
Atklājiet vairāk rīku, kas varētu būt noderīgi jūsu darbplūsmai