אובייקטים מורכבים

יצירה

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

פעולת הרכבה

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

  • לכל אובייקטי המקור צריך להיות אותו סוג אחסון.
  • כל אובייקטי המקור צריכים להיות מאוחסנים באותה קטגוריה של Cloud Storage.

כשמבצעים הרכבה, חשוב לשים לב לדברים הבאים:

  • אפשר גם למחוק סופית את אובייקטי המקור כחלק מתהליך ההרכבה.
  • אפשר להרכיב בין 1 ל-32 אובייקטי מקור.
  • אובייקטי מקור יכולים בעצמם להיות אובייקטים מורכבים.

לאובייקט המורכב שמתקבל מההרכבה יש את המאפיינים הבאים:

  • לאובייקט המורכב יש אותו סוג אחסון כמו לאובייקטי המקור.
  • האובייקט המורכב לא ישתנה אם אובייקטי המקור יוחלפו או יימחקו בהמשך.

כשמשתמשים ב-gcloud storage כדי לבצע הרכבה של אובייקטים, לאובייקט שנוצר מוגדר Content-Type תואם ל-Content-Type של אובייקט המקור הראשון.

מטא-נתונים של אובייקט מורכב

יש מספר הבדלים בין המטא-נתונים של אובייקט מורכב לבין המטא-נתונים של אובייקטים אחרים:

  • לאובייקטים מורכבים אין שדה מטא-נתונים של גיבוב MD5.

    • המערכת מתעלמת מכל ערך MD5 שאתם מספקים כחלק מבקשת יצירה.
  • ערך ה-ETag של אובייקט מורכב לא מבוסס על גיבוב MD5, וקוד הלקוח לא צריך להניח הנחות לגבי תגי ETag של אובייקטים מורכבים, למעט שהם משתנים בכל פעם שהאובייקט הבסיסי משתנה בהתאם למפרטי IETF של HTTP/1.1.

  • לכל אובייקט מורכב יש שדה מטא-נתונים של ספירת רכיבים, שסופר את מספר האובייקטים הלא-מורכבים הכלולים באובייקט המורכב.

    • אם כותבים מחדש אובייקט מורכב למיקום אחר או לסוג אחסון (storage class) אחר, התוצאה תהיה אובייקט מורכב עם מספר רכיבים שהוא 1.

בדיקת תקינות של אובייקטים מורכבים

Cloud Storage משתמש ב-CRC32C כדי לבדוק את התקינות של כל אובייקט מקור בזמן ההעלאה וכדי לאפשר לקורא לבצע בדיקת תקינות של האובייקט המורכב שנוצר אחרי ההורדה. CRC32C הוא קוד לזיהוי שגיאות שאפשר לחשב ביעילות מערכי ה-CRC32C של הרכיבים שלו. האפליקציה צריכה להשתמש ב-CRC32C באופן הבא:

  • כשמעלים אובייקטי מקור, צריך לחשב את ה-CRC32C לכל אובייקט באמצעות ספריית CRC32C, כמו אחת מאלו שמפורטות במאמר בנושא מטא-נתונים של אובייקטים, ולכלול את הערך הזה בבקשה. בהתאם לערכים שתספקו, Cloud Storage יבצע אימות לכל העלאה.
  • פעולת ההרכבה בודקת באופן אוטומטי שאובייקטי המקור מורכבים כמו שצריך, ומתעלמת מכל ערך CRC32C שסיפקתם כחלק מבקשת ההרכבה. בתגובה מוחזר CRC32C של האובייקט המורכב שנוצר.
  • אם האפליקציה יכולה לשנות אובייקטי מקור בין זמן ההעלאה להרכבה של האובייקטים האלו, צריך לציין שמות ספציפיים של אובייקטי המקור כדי להימנע ממרוץ תהליכים. לחלופין, אפשר לבנות ערך CRC32C מערכי ה-CRC32C של אובייקטי המקור המיועדים ולהשוות אותו לערך CRC32C שמוחזר על-ידי פעולת ההרכבה.
  • בזמן ההורדה, צריך לחשב את ה-CRC32C של האובייקט שהורדתם ולהשוות אותו לערך שכלול בתגובה.

צירוף ועריכה

אפשר להשתמש בפעולת הרכבה כדי לבצע פעולות של צירוף ועריכת אובייקטים.

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

לדוגמה, ב-CLI של gcloud, הפקודות הבאות מצרפות את המחרוזת new data לאובייקט קיים:

$ echo 'new data' | gcloud storage cp - gs://bucket/temporary_object
$ gcloud storage objects compose gs://bucket/existing_object gs://bucket/temporary_object \
    gs://bucket/existing_object --delete-source-objects

אפשר להשתמש בהרכבה גם כדי לתמוך בסגנון בסיסי של עריכת אובייקטים. לדוגמה, אפשר להרכיב אובייקט X מהרצף {Y1, Y2, Y3}, להחליף את התוכן של Y2, ולהרכיב מחדש את X מאותם רכיבים. צריך לשים לב שזה מחייב לא למחוק את השדות Y1, Y2 ו-Y3, לכן יתבצע חיוב גם על הרכיבים האלו בשביל ההרכבה.

הקשרים של אובייקטים מורכבים

כשמשתמשים בפעולת ההרכבה, Cloud Storage ממזג את כל ההקשרים מאובייקטי המקור ומצרף אותם לאובייקט היעד. התהליך הזה מטפל במפתחות הקשר הייחודיים ובמפתחות הקשר הכפולים, כמו שמתואר בקטעים הבאים.

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

מפתחות ייחודיים לקביעת גישה מבוססת הקשר

אם לאובייקטים במקור יש מפתחות הקשר ייחודיים, Cloud Storage מצרף ישירות את המפתחות האלה ואת הערכים התואמים שלהם לאובייקט ביעד.

דוגמה:

ההקשרים של אובייקט המקור A: Department: Engineering, Status: Active

ההקשרים של אובייקט המקור B: Owner: m_jones, Version: 1.1

אחרי פעולת השילוב, לאובייקט היעד יש את ההקשרים המשולבים הבאים:

  {
    "contexts": {
      "custom": {
        "Department": {
          "value": "Engineering",
          "createTime": "2023-10-26T10:00:00.000Z",
          "updateTime": "2023-10-26T10:00:00.000Z"
        },
        "Status": {
          "value": "Active",
          "createTime": "2023-10-26T10:00:00.000Z",
          "updateTime": "2023-10-26T10:00:00.000Z"
        },
        "Owner": {
          "value": "m_jones",
          "createTime": "2023-10-26T10:00:00.000Z",
          "updateTime": "2023-10-26T10:00:00.000Z"
        },
        "Version": {
          "value": "1.1",
          "createTime": "2023-10-26T10:00:00.000Z",
          "updateTime": "2023-10-26T10:00:00.000Z"
        }
      }
    }
  }
  

מפתחות הקשר כפולים

אם לכמה אובייקטים של מקור יש אותו מפתח הקשר, הערך מהאובייקט האחרון של המקור ברשימת ההרכבה שמכיל את המפתח הזה משמש לאובייקט המורכב.

לדוגמה, נניח שאובייקטים במקור מעובדים בסדר הבא:

  1. אובייקט מקור א'

  2. אובייקט מקור B

ההקשרים של אובייקט המקור A: Version: 1.0, ReleaseDate: 2024-01-15

ההקשרים של אובייקט המקור B: Version: 1.1, Owner: m_jones

לשני אובייקטי המקור יש מפתח Version, אבל לאובייקט א' יש Version: 1.0 ולאובייקט ב' יש Version: 1.1. מכיוון ש-Cloud Storage מעבד את אובייקט המקור B אחרי אובייקט המקור A, הערך Version מאובייקט המקור B מקבל עדיפות והערך הסופי הוא 1.1.

אובייקט היעד משלב את ההקשרים האלה באופן הבא:

  {
    "contexts": {
      "custom": {
        "Version": {
          "value": "1.1",
          "createTime": "2025-01-01T00:00:00.000Z",
          "updateTime": "2025-01-01T00:00:00.000Z"
        },
        "ReleaseDate": {
          "value": "2024-01-15",
          "createTime": "2025-01-01T00:00:00.000Z",
          "updateTime": "2025-01-01T00:00:00.000Z"
        },
        "Owner": {
          "value": "m_jones",
          "createTime": "2025-01-01T00:00:00.000Z",
          "updateTime": "2025-01-01T00:00:00.000Z"
        }
      }
    }
  }
  

המאמרים הבאים