13 คะแนน โดย GN⁺ 2023-10-03 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Buildkite นำมาตรฐาน UUIDv7 แบบใหม่มาใช้เป็น PK เพื่อแทนที่ระบบ PK แบบลำดับเดิมและคีย์รองแบบ UUID
  • UUIDs (Universally Unique Identifiers) คือรหัสระบุที่ไม่ซ้ำกันซึ่งสามารถสร้างได้อย่างอิสระ และถูกใช้อย่างแพร่หลายในระบบกระจายและฐานข้อมูล
  • UUIDs มีข้อดีหลายอย่างเหนือกว่าตัวระบุจำนวนเต็มแบบลำดับ เช่น ความคาดเดาได้ยาก การป้องกันการเปิดเผยข้อมูลภายในที่อ่อนไหว และการเพิ่มชั้นการป้องกันอีกระดับ
  • อย่างไรก็ตาม ความสุ่มของ UUID มาตรฐานที่ไม่ได้เรียงตามเวลาสามารถก่อให้เกิดปัญหาด้านประสิทธิภาพของฐานข้อมูลได้
  • เพื่อแก้ปัญหานี้ Buildkite ได้ทดลองใช้ UUID ที่เรียงตามเวลาและเข้ากันได้กับ UUIDv4 ซึ่งช่วยลดอัตรา Write Ahead Log (WAL) ของฐานข้อมูลหลักลงได้ 50%
  • UUID เวอร์ชัน 7 (UUIDv7) เข้ารหัส Unix timestamp ระดับมิลลิวินาทีไว้ใน 48 บิตที่สำคัญที่สุด และสร้างอีก 74 บิตที่เหลือแบบสุ่ม
  • Buildkite ตัดสินใจใช้ UUIDv7 เป็นคีย์หลักของทุกตารางใหม่ ซึ่งช่วยตัดความจำเป็นในการประสานการสร้างตัวระบุและทำให้ตรรกะของแอปพลิเคชันง่ายขึ้น
  • มีการพิจารณาทางเลือกอื่น เช่น การใช้งาน ShardingID ของ Instagram และการใช้งานคีย์หลักแบบประกอบของ Shopify แต่สุดท้ายทีมเลือก UUIDv7
  • การเปลี่ยนไปใช้ UUIDv7 ต้องใช้พื้นที่จัดเก็บเพิ่มขึ้นจากความยาว 128 บิตของ UUID แต่เมื่อเทียบกับพื้นที่ส่วนอื่นของแถวข้อมูลในฐานข้อมูลแล้วถือว่าน้อยมาก
  • ปัจจุบันกำลังทำ sharding ให้กับฐานข้อมูล Postgres ที่ใหญ่ที่สุด และในอนาคตอาจใช้ UUIDv8 เพื่อใส่หมายเลขชาร์ดไว้ในตัวระบุหากจำเป็น

1 ความคิดเห็น

 
GN⁺ 2023-10-03
ความเห็นจาก Hacker News
  • UUIDv7 มีประโยชน์ต่อระบบกระจายภายในเนื่องจากเป็นคีย์ที่เรียงลำดับได้ แต่อาจไม่เหมาะเป็นตัวระบุสาธารณะเพราะมีประเด็นด้านความปลอดภัยที่อาจเกิดขึ้น
  • มักมีการอ้างว่า ID แบบสุ่มส่งผลเสียต่อประสิทธิภาพ แต่ในทางปฏิบัติแล้วกลับเหมาะกับระบบจัดเก็บข้อมูลแบบกระจายมากกว่า เพราะช่วยป้องกันฮอตสปอตบนโหนดเดียว
  • UUID มีหลายเวอร์ชัน เพราะข้อกำหนดและคุณสมบัติที่ต้องการของตัวระบุเปลี่ยนแปลงไปตามการใช้งาน
  • UUIDv7 ผสานข้อดีของคีย์หลักแบบเรียงลำดับสำหรับการทำดัชนีอย่างมีประสิทธิภาพ เข้ากับคีย์รองแบบ UUID สำหรับการใช้งานภายนอก
  • ปัญหาที่อาจเกิดขึ้นอย่างหนึ่งของ UUIDv7 คือผู้ใช้สามารถดึงเวลาในการสร้างออกมาจาก ID ได้
  • มีการเผยแพร่ฟังก์ชัน UUID v7 สำหรับ PostgreSQL แบบโอเพนซอร์ส ซึ่งให้ประโยชน์ เช่น เพิ่มความเร็วในการแทรกข้อมูลแบบเป็นชุด
  • UUIDv7 สามารถใช้ร่วมกับชนิดข้อมูล uuid ของ Postgres ได้ ซึ่งยอมรับข้อมูลใด ๆ ที่มีความยาวถูกต้อง
  • บางคนชอบใช้คีย์หลัก 64 บิตแบบเรียงลำดับ พร้อมคีย์สุ่ม 64 บิตเพิ่มเติมสำหรับใช้งานภายนอก เพื่อซ่อนข้อมูลเกี่ยวกับขนาดข้อมูลและวันที่สร้าง
  • UUID มีประโยชน์สำหรับการสร้างคีย์จากหลายแหล่งที่แยกจากกัน ซึ่งต้องนำมารวมกันในภายหลัง
  • มีการถกเถียงกันถึงความจำเป็นในการ "ตรวจสอบความถูกต้อง" ของ GUID/UUID โดยมักถือว่าสิ่งเหล่านี้เป็นตัวระบุแบบทึบแสง
  • การเลือกระหว่าง UUIDv7 กับ ULID ขึ้นอยู่กับความต้องการเฉพาะ โดย ULID ให้ความสุ่มเพิ่มอีก 6 บิต เมื่อเทียบกับส่วนที่ UUID ใช้สำหรับเมตาดาตา