🛠️

Whiz Tools

Build • Create • Innovate

Twitter Kar Tanesi ID Üretici ve Analiz Aracı

Dağıtık sistemlerde kullanılan, benzersiz 64 bit kimlikler olan Twitter Kar Tanesi ID'lerini oluşturun ve analiz edin. Bu araç, yeni Kar Tanesi ID'leri oluşturmanıza ve mevcut olanları ayrıştırmanıza olanak tanır, zaman damgası, makine ID'si ve sıra numarası bileşenleri hakkında içgörüler sağlar.

Kar Tanesi ID Üretici

Kar Tanesi ID Üretici

Optional: Unix timestamp in milliseconds (defaults to current time)
📚

Dokümantasyon

Snowflake ID Üretici

Giriş

Bir Snowflake ID, dağıtık sistemlerde kullanılan benzersiz bir tanımlayıcıdır ve ilk olarak Twitter tarafından geliştirilmiştir. Bu araç, bir zaman damgası, makine ID'si ve sıra numarasından oluşan 64 bitlik tamsayı olan Snowflake ID'leri oluşturmanıza ve analiz etmenize olanak tanır.

Snowflake ID'lerin Çalışma Şekli

Snowflake ID'leri, aşağıdaki yapıya sahip 64 bitlik tamsayılar olarak yapılandırılmıştır:

  • 41 bit: Zaman damgası (özel bir epoch'tan itibaren milisaniye cinsinden)
  • 10 bit: Makine ID'si (veri merkezi ID'si için 5 bit, işçi ID'si için 5 bit)
  • 12 bit: Sıra numarası

Bu yapı, her makine için milisaniyede yaklaşık 4.096 benzersiz ID üretimine olanak tanır.

Snowflake ID Üreticisini Kullanma

  1. (İsteğe bağlı) Özel bir epoch ayarlayın (varsayılan, Twitter'ın epoch'u: 2010-11-04T01:42:54.657Z)
  2. Bir makine ID'si (0-31) ve veri merkezi ID'si (0-31) girin
  3. Yeni bir Snowflake ID oluşturmak için "Üret" butonuna tıklayın
  4. Üretilen ID ve bileşenleri görüntülenecektir

Mevcut bir Snowflake ID'yi ayrıştırmak için, "ID'yi Ayrıştır" alanına girin ve "Ayrıştır" butonuna tıklayın.

Formül

Snowflake ID, bit düzeyinde işlemler kullanılarak oluşturulur:

1ID = (zamanDamgası << 22) | (veriMerkeziId << 17) | (işçiId << 12) | sıra
2

Burada:

  • zamanDamgası, epoch'tan itibaren geçen milisaniye sayısıdır
  • veriMerkeziId, 5 bitlik bir tam sayı (0-31)
  • işçiId, 5 bitlik bir tam sayı (0-31)
  • sıra, 12 bitlik bir tam sayı (0-4095)

Hesaplama

Snowflake ID üreticisi aşağıdaki adımları gerçekleştirir:

  1. Geçerli milisaniye cinsinden zaman damgasını alın
  2. Zaman damgasının, son kullanılan zaman damgasından büyük olduğundan emin olun (benzersizlik için)
  3. Zaman damgası, son zaman damgasıyla aynıysa, sıra numarasını artırın
  4. Sıra numarası taşarsa (4096'ya ulaşırsa), bir sonraki milisaniyeyi bekleyin
  5. Bileşenleri bit düzeyinde işlemler kullanarak nihai ID'yi oluşturun

Kullanım Alanları

Snowflake ID'leri özellikle şunlarda faydalıdır:

  1. Dağıtık Sistemler: Koordinasyon olmadan birden fazla makine arasında benzersiz ID'ler üretmek
  2. Yüksek Hacimli Veri: Büyük veri setleri için sıralanabilir ID'ler oluşturmak
  3. Mikro Hizmetler: Farklı hizmetler arasında benzersiz tanımlayıcılar sağlamak
  4. Veritabanı Bölme: Verimli bölme için zaman damgası veya makine ID bileşenini kullanmak

Alternatifler

Snowflake ID'leri güçlü olsa da, diğer ID üretim sistemleri şunlardır:

  1. UUID (Evrensel Benzersiz Tanımlayıcı): Sıralanabilirlik olmadan dağıtık üretim gerektiğinde yararlıdır
  2. Otomatik artan veritabanı ID'leri: Basit ama tek veritabanı örnekleriyle sınırlıdır
  3. ULID (Evrensel Benzersiz Lexicographically Sıralanabilir Tanımlayıcı): Snowflake'e benzer, ancak farklı bir yapıya sahiptir

Kenar Durumlar ve Sınırlamalar

  1. Saat Senkronizasyonu: Snowflake ID'leri sistem zamanına dayanır. NTP ayarlamaları veya yaz saati uygulaması değişiklikleri nedeniyle saat geriye giderse, ID üretiminde sorunlar ortaya çıkabilir.

  2. 2038 Sorunu: 41 bitlik zaman damgası 2079'da taşacaktır (Twitter epoch'unu varsayarak). Snowflake ID'leri kullanan sistemler bu durumu planlamalıdır.

  3. Makine ID Çakışmaları: Büyük dağıtık sistemlerde, benzersiz makine ID'leri sağlamak zor olabilir ve ek koordinasyon gerektirebilir.

  4. Sıra Taşması: Son derece yüksek hacimli senaryolarda, milisaniyede 4096 sıralamayı tüketmek mümkündür, bu da gecikmelere neden olabilir.

  5. Makinalar Arasında Monoton Olmama: ID'ler tek bir makinede monotonik olarak artarken, birden fazla makine arasında kesinlikle monoton olmayabilir.

Tarihçe

Snowflake ID'leri, dağıtık, zaman sıralı benzersiz tanımlayıcılara olan ihtiyacı karşılamak için 2010 yılında Twitter tarafından tanıtılmıştır. O zamandan beri birçok başka şirket ve proje tarafından benimsenmiş ve uyarlanmıştır.

Örnekler

İşte çeşitli dillerde Snowflake ID üreticilerinin uygulamaları:

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('Saat geriye gitti. ID üretmeyi reddediyorum');
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// Kullanım
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Üretilen Snowflake ID: ${id}`);
58

Diyagram

İşte Snowflake ID yapısının görsel temsili:

Zaman Damgası (41 bit) Makine ID'si (10 bit) Sıra (12 bit)

64 bitlik Snowflake ID Yapısı

Referanslar

  1. "Snowflake'ı Duyuruyoruz." Twitter Mühendislik Blogu, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Vikipedi, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Mikro Hizmetlerde Dağıtık ID Üretimi." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f