🛠️

Whiz Tools

Build • Create • Innovate

เครื่องสร้างและวิเคราะห์ ID Snowflake ของ Twitter

สร้างและวิเคราะห์ ID Snowflake ของ Twitter ซึ่งเป็นตัวระบุที่ไม่ซ้ำกัน 64 บิตที่ใช้ในระบบกระจาย เครื่องมือนี้ช่วยให้คุณสร้าง ID Snowflake ใหม่และแยกวิเคราะห์ ID ที่มีอยู่ โดยให้ข้อมูลเชิงลึกเกี่ยวกับส่วนประกอบของเวลา เครื่อง ID และหมายเลขลำดับ

ตัวสร้าง ID Snowflake

ตัวสร้าง ID Snowflake

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

เอกสารประกอบ

Snowflake ID Generator

Introduction

Snowflake ID เป็นตัวระบุที่ไม่ซ้ำกันซึ่งใช้ในระบบกระจาย โดยพัฒนาโดย Twitter เครื่องมือนี้ช่วยให้คุณสามารถสร้างและวิเคราะห์ Snowflake IDs ซึ่งเป็นจำนวนเต็ม 64 บิตที่ประกอบด้วย timestamp, machine ID และ sequence number

How Snowflake IDs Work

Snowflake IDs เป็นจำนวนเต็ม 64 บิตที่มีโครงสร้างดังนี้:

  • 41 บิต: Timestamp (มิลลิวินาทีตั้งแต่ยุคที่กำหนด)
  • 10 บิต: Machine ID (5 บิตสำหรับ data center ID, 5 บิตสำหรับ worker ID)
  • 12 บิต: Sequence number

โครงสร้างนี้ช่วยให้สามารถสร้าง ID ที่ไม่ซ้ำกันได้ประมาณ 4,096 ID ต่อมิลลิวินาทีต่อเครื่อง

Using the Snowflake ID Generator

  1. (ไม่บังคับ) ตั้งค่า epoch ที่กำหนดเอง (ค่าเริ่มต้นคือ epoch ของ Twitter: 2010-11-04T01:42:54.657Z)
  2. ป้อน machine ID (0-31) และ data center ID (0-31)
  3. คลิก "Generate" เพื่อสร้าง Snowflake ID ใหม่
  4. ID ที่สร้างขึ้นและส่วนประกอบของมันจะแสดง

ในการวิเคราะห์ Snowflake ID ที่มีอยู่ ให้ป้อน ID ในช่อง "Parse ID" และคลิก "Parse"

Formula

Snowflake ID ถูกสร้างขึ้นโดยใช้การดำเนินการแบบ bitwise:

1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2

โดยที่:

  • timestamp คือจำนวนมิลลิวินาทีตั้งแต่ยุค
  • datacenterId คือจำนวนเต็ม 5 บิต (0-31)
  • workerId คือจำนวนเต็ม 5 บิต (0-31)
  • sequence คือจำนวนเต็ม 12 บิต (0-4095)

Calculation

ตัวสร้าง Snowflake ID ทำตามขั้นตอนดังต่อไปนี้:

  1. รับ timestamp ปัจจุบันในมิลลิวินาที
  2. ตรวจสอบให้แน่ใจว่า timestamp มากกว่าตัว timestamp ที่ใช้ล่าสุด (เพื่อความไม่ซ้ำกัน)
  3. หาก timestamp เท่ากับตัวล่าสุด ให้เพิ่ม sequence number
  4. หาก sequence number เกินขอบเขต (ถึง 4096) ให้รอจนถึงมิลลิวินาทีถัดไป
  5. รวมส่วนประกอบโดยใช้การดำเนินการแบบ bitwise เพื่อสร้าง ID สุดท้าย

Use Cases

Snowflake IDs มีประโยชน์โดยเฉพาะใน:

  1. ระบบกระจาย: สร้าง ID ที่ไม่ซ้ำกันทั่วหลายเครื่องโดยไม่ต้องประสาน
  2. ข้อมูลปริมาณสูง: สร้าง ID ที่สามารถเรียงลำดับได้สำหรับชุดข้อมูลขนาดใหญ่
  3. Microservices: รับประกันตัวระบุที่ไม่ซ้ำกันในบริการต่างๆ
  4. Database Sharding: ใช้ส่วนประกอบ timestamp หรือ machine ID สำหรับการแบ่งข้อมูลอย่างมีประสิทธิภาพ

Alternatives

แม้ว่า Snowflake IDs จะมีพลัง แต่ระบบการสร้าง ID อื่นๆ ได้แก่:

  1. UUID (Universally Unique Identifier): มีประโยชน์เมื่อจำเป็นต้องสร้างแบบกระจายโดยไม่มีการเรียงลำดับ
  2. Auto-incrementing database IDs: ง่ายแต่จำกัดอยู่ที่อินสแตนซ์ฐานข้อมูลเดียว
  3. ULID (Universally Unique Lexicographically Sortable Identifier): คล้ายกับ Snowflake แต่มีโครงสร้างที่แตกต่างกัน

Edge Cases and Limitations

  1. การซิงโครไนซ์นาฬิกา: Snowflake IDs ขึ้นอยู่กับเวลาในระบบ หากนาฬิกาย้อนกลับเนื่องจากการปรับ NTP หรือการเปลี่ยนเวลาในฤดู จะทำให้เกิดปัญหาในการสร้าง ID

  2. ปัญหาปี 2038: timestamp 41 บิตจะล้นในปี 2079 (สมมติว่าเป็น epoch ของ Twitter) ระบบที่ใช้ Snowflake IDs ควรวางแผนสำหรับเหตุการณ์นี้

  3. การชนกันของ Machine ID: ในระบบกระจายขนาดใหญ่ การรับประกันว่า machine IDs ไม่ซ้ำกันอาจเป็นเรื่องท้าทายและอาจต้องการการประสานงานเพิ่มเติม

  4. การล้นของ Sequence: ในสถานการณ์ที่มีการส่งข้อมูลสูงมาก อาจมีความเป็นไปได้ที่จะใช้ sequence 4096 ต่อมิลลิวินาทีจนหมด ซึ่งอาจทำให้เกิดความล่าช้า

  5. การไม่เป็นระเบียบในหลายเครื่อง: แม้ว่า IDs จะเพิ่มขึ้นอย่างต่อเนื่องในเครื่องเดียว แต่ก็อาจไม่เป็นระเบียบอย่างเคร่งครัดในหลายเครื่อง

History

Snowflake IDs ถูกนำเสนอโดย Twitter ในปี 2010 เพื่อแก้ปัญหาความต้องการตัวระบุที่ไม่ซ้ำกันและสามารถเรียงลำดับเวลาได้ในระบบกระจาย ตั้งแต่นั้นมาได้มีการนำไปใช้และปรับปรุงโดยบริษัทและโครงการอื่นๆ หลายแห่ง

Examples

นี่คือตัวอย่างการสร้าง Snowflake ID ในหลายภาษา:

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('นาฬิกาย้อนกลับ ปฏิเสธที่จะสร้าง 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// การใช้งาน
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Snowflake ID ที่สร้างขึ้น: ${id}`);
58

Diagram

นี่คือการแสดงภาพโครงสร้างของ Snowflake ID:

Timestamp (41 บิต) Machine ID (10 บิต) Sequence (12 บิต)

โครงสร้าง Snowflake ID ขนาด 64 บิต

References

  1. "ประกาศ Snowflake." บล็อกวิศวกรรมของ Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." วิกิพีเดีย, https://th.wikipedia.org/wiki/Snowflake_ID
  3. "การสร้าง ID แบบกระจายใน Microservices." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f
🔗

เครื่องมือที่เกี่ยวข้อง

ค้นพบเครื่องมือเพิ่มเติมที่อาจมีประโยชน์สำหรับการทำงานของคุณ

เครื่องมือสร้าง UUID สำหรับแอปพลิเคชันต่างๆ

ลองเครื่องมือนี้

ตัวสร้าง Nano ID ที่ปลอดภัยและไม่ซ้ำกัน

ลองเครื่องมือนี้

เครื่องสร้างชื่อโปรเจคแบบสุ่ม

ลองเครื่องมือนี้

เครื่องสร้าง User Agent แบบสุ่มสำหรับการทดสอบการพัฒนาเว็บ

ลองเครื่องมือนี้

เครื่องสร้างคีย์ API แบบสุ่ม: สร้างสตริงที่ปลอดภัยยาว 32 ตัวอักษร

ลองเครื่องมือนี้

เครื่องสร้างหมายเลข CPF สำหรับการทดสอบและพัฒนา

ลองเครื่องมือนี้

เครื่องสร้างตำแหน่งสุ่ม: ผู้สร้างพิกัดทั่วโลก

ลองเครื่องมือนี้

เครื่องมือสร้าง MD5 Hash

ลองเครื่องมือนี้

เครื่องมือสร้าง KSUID สำหรับระบบที่กระจายและฐานข้อมูล

ลองเครื่องมือนี้

เครื่องสร้างชื่อทารกพร้อมหมวดหมู่ - ค้นหาชื่อที่สมบูรณ์แบบ

ลองเครื่องมือนี้