כתיבה מחדש של אובייקט ב-Cloud Storage מעתיקה או משנה אובייקט קיים, למשל מעבירה אותו בין מיקומים, מחליפה את מפתח ההצפנה שלו או משנה את סוג האחסון שלו. בהתאם לגודל האובייקט ולפרמטרים של הכתיבה מחדש, יכול להיות ש-Cloud Storage ישלים את הפעולה בקריאה אחת או יחזיר התקדמות ביניים עם rewrite_token. כשקריאה מחזירה את הערך rewrite_token, מעבירים את האסימון הזה לבקשות הבאות עד שהשכתוב מסתיים.
במאמר הזה מוסבר איך להגדיר בקשת שכתוב ולהפעיל את לולאת השכתוב באמצעות פונקציית העזר rewrite_until_done או לולאה ידנית בספריות הלקוח של Cloud ל-Rust. אם אתם משתמשים חדשים בספריית הלקוח, קודם כדאי לקרוא את המאמר שימוש ב-Cloud Storage עם Rust.
לפני שמתחילים
לפני שמריצים את הקוד במסמך הזה, צריך להשלים את הדרישות המוקדמות הבאות:
- יוצרים או בוחרים פרויקט ב-Google Cloud שהחיוב מופעל בו.
- יוצרים קטגוריה של Cloud Storage לבדיקה ייעודית בפרויקט.
- מגדירים את Application Default Credentials בסביבה שלכם.
- מקצים לחשבון המשתמש תפקיד בניהול זהויות והרשאות גישה (IAM) עם הרשאה לקרוא, לכתוב ולמחוק אובייקטים בקטגוריה, כמו אדמין של אחסון (
roles/storage.admin).
יחסי תלות
מוסיפים את ספריית הלקוח של Cloud Storage ואת ה-crates התומכים לקובץ Cargo.toml:
cargo add google-cloud-storage google-cloud-gax anyhow bytes
cargo add tokio --features macros,rt-multi-thread
הכנת הלקוח ובקשת השכתוב
גם העוזר האוטומטי וגם הלולאה הידנית מתחילים מלקוח StorageControl ומבונה בקשות RewriteObject שהוגדרו. בתוך היקף שמקבל את bucket_name בפורמט projects/_/buckets/BUCKET_ID, מבצעים את הפעולות הבאות:
מאתחלים לקוח
StorageControlעם מדיניות ניסיון חוזר. מומלץ להמתין לפחות 30 שניות בין בקשה לבקשה. בדוגמה הזו משתמשים ב-RetryableErrorsעם מגבלה של 5 ניסיונות וללא מגבלת זמן כוללת לכל פעולה:יוצרים את ה-request builder של
rewrite_object, מסמנים את הבקשה כאידמפוטנטית כדי שהלקוח יוכל לנסות שוב במקרה של שגיאות זמניות, ומגדירים את שמות הקטגוריות והאובייקטים של המקור והיעד:אופציונלי: הגבלת מספר הבייטים המקסימלי לשכתוב בכל קריאה, כדי שבקשות ספציפיות יחזירו התקדמות מהר יותר במקום לדרוש זמן קצוב ארוך יותר לבקשה. בדוגמה הזו מוגדרת מגבלה קטנה של 1 MiB כדי לאלץ כמה חזרות. בסביבת הייצור צריך להשתמש בערך גדול יותר:
אופציונלי: מציינים את המטא-נתונים של אובייקט היעד, כמו שינוי סוג האחסון ל-Nearline (
NEARLINE):
הפעלה אוטומטית של לולאת השכתוב
ברוב התרחישים לדוגמה, צריך להביא את המאפיין RewriteObjectExt להיקף ולהפעיל את rewrite_until_done בבונה הבקשות. הפונקציה הזו מנהלת את rewrite_token בין האיטרציות, ומחזירה את המטא-נתונים של היעד Object אחרי שהשכתוב מסתיים:
הפעלה ידנית של לולאת השכתוב
אם אתם צריכים לתעד ספירות בייטים של ביניים, לבדוק את ההתקדמות או להמשיך שכתוב מתהליך אחר, הפעילו את לולאת השכתוב באופן ידני:
מגדירים פונקציית עזר ששולחת בקשת
RewriteObjectאחת, מתעדת את ההתקדמות ומחזירה את המטא-נתונים שלObjectשהושלמו כש-resp.doneהואtrue, או את ה-rewrite_tokenהבא:מפעילים את פונקציית העזר בלולאה, משכפלים את הכלי ליצירת בקשות בכל איטרציה ומעבירים את האסימון שהוחזר אל
set_rewrite_tokenבכל פעם ש-make_one_requestמחזירה את הערךRewriteProgress::Incomplete:
השלמת הקוד
בדוגמה הבאה, אובייקט מקור בגודל 3 MiB מועלה ומשוכתב לסוג האחסון Nearline Storage במרווחים של 1 MiB באמצעות הלולאה הידנית. אחרי שהכתיבה מחדש מסתיימת, הדוגמה מוחקת את אובייקטי הבדיקה ואת קטגוריית הבדיקה הריקה:
הפלט אמור להיראות כך, עם ההתקדמות בשלוש איטרציות והמטא-נתונים של אובייקט היעד:
PROGRESS: total_bytes_rewritten=1048576; object_size=3145728
PROGRESS: total_bytes_rewritten=2097152; object_size=3145728
DONE: total_bytes_rewritten=3145728; object_size=3145728
dest_object=Object { name: "rewrite-object-clone", ... }
הסרת המשאבים
אם הדוגמה מסתיימת מוקדם או אם אתם מריצים קטעי קוד נפרדים בלי כלי העזר לניקוי, מחקו את כל אובייקטי הבדיקה שנותרו ומחקו את קטגוריית הבדיקה כשתסיימו, כדי שלא תצברו חיובים שוטפים בחשבון Google Cloud .