דלג לתוכן

מחולל מזהי שלג - יצירת מזהים מופצים ייחודיים

מחולל ומפענח מזהי שלג חינמי. צור מזהים ייחודיים בני 64 סיביות למערכות מופצות. פענח מזהים קיימים כדי להוציא חותמת זמן, מזהה מכונה וסדר.

מחולל מזהי שלג

אופציונלי: חותמת זמן Unix במילישניות (ברירת מחדל: זמן נוכחי)

מזהה מכונה (0-31)

מזהה מרכז נתונים (0-31)

מספר רצף (0-4095)

מזהה שלג
2094810863180447744
00111010001001001000011011000011001101110
00000
00000
000000000000
חותמת זמן (41 סיביות)
מזהה מרכז נתונים (5 סיביות)
מזהה מכונה (5 סיביות)
מספר רצף (12 סיביות)
מחשבון טעינה...
📚

תיעוד

מהו מחולל מזהי Snowflake?

מחולל מזהי Snowflake יוצר מספר ייחודי באורך 64 סיביות מחותמת זמן, מזהה מכונה ומספר רצף. טוויטר יצרה את התבנית בשנת 2010 כדי להעניק לכל ציוץ מזהה ששרתים רבים יוכלו ליצור בו־זמנית, בלי לשאול זה את זה "האם כבר נעשה שימוש במספר הזה?" כלי זה יוצר מזהה Snowflake אחד מהערכים שהוזנו ומראה כיצד ערכים אלה ממלאים את 64 הסיביות.

כיצד מחולל מזהי Snowflake פועל

המחולל מקבל ארבעה קלטים:

  • חותמת זמן: חותמת זמן של Unix באלפיות השנייה. השאירו את השדה ריק כדי להשתמש בזמן הנוכחי.
  • מזהה מכונה: מספר שלם מ־0 עד 31 (5 סיביות). זהו "מזהה העובד" המקורי של טוויטר.
  • מזהה מרכז נתונים: מספר שלם מ־0 עד 31 (5 סיביות).
  • מספר רצף: מספר שלם מ־0 עד 4095 (12 סיביות), המשמש להבחנה בין מזהים שנוצרו באותה אלפית שנייה.

הכלי משלב את ארבעת הערכים למזהה אחד באורך 64 סיביות. לאחר מכן הוא מציג את התוצאה בצורה בינארית, כשהיא מחולקת למקטעי חותמת הזמן, מרכז הנתונים, המכונה והרצף.

חותמת הזמן נמדדת מנקודת התחלה קבועה הנקראת תקופת Twitter: 4 בנובמבר 2010, 1:42:54.657 UTC, או 1,288,834,974,657 אלפיות השנייה לאחר תקופת Unix. מחולל זה אינו מאפשר לשנות את נקודת ההתחלה. כל מזהה שהוא יוצר נמדד מתאריך קבוע יחיד זה.

מבנה מזהה Snowflake

מזהה Snowflake הוא מספר שלם באורך 64 סיביות, המחולק לארבעה חלקים הנקראים מהסיבית המשמעותית ביותר כלפי מטה:

סיביותשדהטווח
1סיבית הסימןתמיד 0
41חותמת זמןאלפיות השנייה מאז תקופת Twitter
5מזהה מרכז נתונים0–31
5מזהה מכונה (עובד)0–31
12מספר רצף0–4095

הסיבית המובילה היא תמיד 0, ולכן מזהה Snowflake הוא תמיד מספר חיובי. שדה חותמת הזמן באורך 41 סיביות ושדה הרצף באורך 12 סיביות הם שני החלקים שהופכים את מזהי Snowflake לשימושיים למיון: למזהים שנוצרו מאוחר יותר יש מקטע חותמת זמן גדול יותר, ולכן הם ממוינים אחרי המזהים המוקדמים יותר.

נוסחת מזהה Snowflake

המחולל בונה את המזהה באמצעות הנוסחה הזו:

d=t−1288834974657d = t - 1288834974657

I=(d<<22)∣(c<<17)∣(m<<12)∣sI = (d << 22) \mathbin{|} (c << 17) \mathbin{|} (m << 12) \mathbin{|} s

כאשר d הוא ההפרש, t היא חותמת הזמן שהוזנה באלפיות השנייה, I הוא המזהה המוגמר, c הוא מזהה מרכז הנתונים, m הוא מזהה המכונה ו־s הוא מספר הרצף.

<< הוא הזזה שמאלה של סיביות. הזזת מספר שמאלה ב־22 סיביות שקולה להכפלתו ב־2²², או ב־4,194,304. כמויות ההזזה (22, 17, 12) נובעות ישירות מרוחבי השדות: שדה הרצף רחב 12 סיביות, ולכן מזהה המכונה ממוקם 12 סיביות למעלה; שדה המכונה רחב 5 סיביות, ולכן מזהה מרכז הנתונים ממוקם 17 סיביות למעלה (12 + 5); וכן הלאה.

כיצד לחשב מזהה Snowflake: דוגמה מפורטת

נניח שמישהו מזין:

  • חותמת זמן: 1,288,834,975,657 (בדיוק 1,000 אלפיות השנייה לאחר תקופת Twitter)
  • מזהה מרכז נתונים: 1
  • מזהה מכונה: 1
  • מספר רצף: 0

שלב 1 — מציאת ההפרש. מחסרים את התקופה מחותמת הזמן: 1,288,834,975,657 − 1,288,834,974,657 = 1,000.

שלב 2 — הזזת כל שדה למקומו.

  • חותמת זמן: 1,000 << 22 = 4,194,304,000
  • מזהה מרכז נתונים: 1 << 17 = 131,072
  • מזהה מכונה: 1 << 12 = 4,096
  • רצף: 0

שלב 3 — שילוב באמצעות OR ברמת הסיביות. מאחר שאף אחד מהשדות שהוזזו אינו חופף לאחרים, חיבורם נותן את אותה תוצאה כמו פעולת OR עליהם:

4,194,304,000 + 131,072 + 4,096 + 0 = 4,194,439,168

זהו מזהה Snowflake עבור קלט זה. תצוגת התוצאה של הכלי מחלקת מחדש את אותה מחרוזת בינארית באורך 64 סיביות לבלוק חותמת זמן באורך 41 סיביות, לבלוק מרכז נתונים באורך 5 סיביות, לבלוק מכונה באורך 5 סיביות ולבלוק רצף באורך 12 סיביות, כך שמבנה המספר נשאר גלוי.

היכן משתמשים במזהי Snowflake

טוויטר פיתחה את התבנית כדי להעניק לציוצים מזהים ייחודיים, המסודרים בקירוב לפי זמן, על פני אלפי מכונות מסד נתונים, בלי מונה מרכזי שכל שרת יצטרך לבדוק. בהמשך אימצו Discord ו־Instagram תכנוני מזהים דומים באורך 64 סיביות עבור הודעות ופוסטים. אותו רעיון מופיע גם בפיצול מסדי נתונים, במזהי הזמנות למערכות מסחר מקוון וברישומי אירועים ביישומים מבוזרים. הוא מתאים לכל סביבה שבה מכונות רבות מקצות מזהים באופן עצמאי ועדיין נדרש למיין אותם בקירוב לפי זמן.

מגבלות של מזהי Snowflake

מחולל Snowflake בסביבת ייצור מחזיק בדרך כלל שעון רץ משלו: הוא מגדיל את מספר הרצף עבור כל מזהה שנוצר באותה אלפית שנייה וממתין לאלפית השנייה הבאה כאשר הרצף מגיע ל־4,095. כלי זה אינו שומר מצב בין חישובים. הוא בונה מזהה אחד מהערכים שהוזנו, ולכן שימושי לחקר התבנית אך שונה משירות ייצור פעיל.

לתכנון יש מגבלות קבועות, בלי קשר לשירות שמיישם אותו:

  • תקופה קבועה: מחולל זה מקבל רק חותמות זמן בתאריך 4 בנובמבר 2010 או לאחריו (תקופת Twitter). לא ניתן לקודד תאריכים מוקדמים יותר.
  • תקרת חותמת הזמן: שדה חותמת הזמן באורך 41 סיביות מתמלא בסביבות יולי 2080. לאחר מכן ההפרש מהתקופה אינו נכנס עוד ל־41 סיביות.
  • מגבלת הרצף: מכונה אחת יכולה להנפיק רק 4,096 מזהים שונים (0–4095) באותה אלפית שנייה, לפני שהערכים יחזרו על עצמם.
  • מרחב המכונות: עם 5 סיביות לכל אחד ממזהה המכונה ומזהה מרכז הנתונים, לפריסה יש 1,024 זהויות מכונה שונות (32 × 32) שניתן להקצות ללא התנגשויות.
  • סדר מקומי, לא כלל־עולמי: מזהים ממוינים כראוי זה ביחס לזה רק אם מקורם במכונות בעלות שעונים מסונכרנים. סחיפת שעון בין מכונות עלולה לשבור את הסדר הזמני המחמיר.

ההיסטוריה של מזהה Snowflake

טוויטר הכריזה על תבנית מזהה Snowflake בשנת 2010 כתחליף למזהי מסד נתונים פשוטים בעלי הגדלה אוטומטית, שאינם מתרחבים היטב על פני שרתי מסד נתונים עצמאיים רבים. השם נבע מהרעיון שכמו פתיתי שלג אמיתיים, אין שני מזהים שנוצרו זהים. בהמשך הקוד של התכנון שוחרר לציבור והוא הועתק, בצורה מותאמת, על ידי פלטפורמות גדולות אחרות שנזקקו לאותו דבר: מזהים ייחודיים וניתנים למיון, שנוצרים על ידי מכונות רבות בו־זמנית.

שאלות נפוצות

מהו מזהה Snowflake? מזהה Snowflake הוא מספר באורך 64 סיביות, המורכב מחותמת זמן, מזהה מכונה ומספר רצף, ותוכנן כך שמכונות רבות יוכלו ליצור מזהים ייחודיים בלי לתאם ביניהן.

מהי נוסחת מזהה Snowflake? id = ((timestamp − epoch) << 22) | (dataCenterId << 17) | (machineId << 12) | sequence, כאשר התקופה היא תאריך התחלה קבוע ו־<< הוא הזזה שמאלה של סיביות.

האם ניתן לשנות את התקופה במחולל הזה? לא. כלי זה תמיד מודד את חותמת הזמן מתקופת Twitter הקבועה, 4 בנובמבר 2010. אין שדה להגדרת תאריך התחלה אחר.

האם כלי זה מפענח מזהה Snowflake קיים? לא. הוא רק בונה מזהה חדש מחותמת הזמן, מזהה המכונה, מזהה מרכז הנתונים ומספר הרצף שהוזנו, ולאחר מכן מציג את פירוט הסיביות של המזהה החדש.

כמה מזהי Snowflake יכולה מכונה אחת ליצור באלפית שנייה? עד 4,096, מכיוון ששדה הרצף רחב 12 סיביות (הערכים 0 עד 4,095).

עד איזו שנה מחולל זה יכול להפיק חותמות זמן תקפות? עד סביבות יולי 2080. שדה חותמת הזמן באורך 41 סיביות יכול להכיל לכל היותר כ־69.7 שנים, הנמדדות מתקופת 2010 הקבועה, ולאחר מכן הערך חורג מגבולות השדה.

מקורות

  1. "הכרזה על Snowflake." הבלוג ההנדסי של טוויטר, 2010.
  2. "Snowflake ID." ויקיפדיה, https://en.wikipedia.org/wiki/Snowflake_ID