הלקוח של Cloud Storage בספריות הלקוח ב-Cloud ל-Rust כותב אובייקטים על ידי משיכת קטעי מטען ייעודי (payload) מסוג שמטמיע את המאפיין StreamingSource.
אם האפליקציה מזהה מצב שגיאה בזמן יצירה או סטרימינג של נתונים, החזרת שגיאה מההטמעה של StreamingSource מונעת מספריית הלקוח להשלים את יצירת האובייקט.
במסמך הזה מוסבר איך להגדיר סוג שגיאה בהתאמה אישית ולהטמיע את StreamingSource כדי להחזיר את השגיאה הזו באמצע הסטרימינג. אתם גם מוודאים שההעלאה שנכשלה מחזירה את השגיאה שלכם בלי ליצור את האובייקט. אם אתם משתמשים חדשים בספריית הלקוח, קודם כדאי לקרוא את המאמר שימוש ב-Cloud Storage עם Rust.
לפני שמתחילים
לפני שמריצים את הקוד במסמך הזה, צריך להשלים את הדרישות המוקדמות הבאות:
- יוצרים או בוחרים פרויקט ב-Google Cloud שהחיוב מופעל בו.
- יוצרים קטגוריה של Cloud Storage בפרויקט.
- מגדירים Application Default Credentials ונותנים לחשבון הראשי תפקיד בניהול זהויות והרשאות גישה (IAM) עם הרשאה ליצור אובייקטים בקטגוריה, כמו Storage Object User (
roles/storage.objectUser).
יחסי תלות
מוסיפים את ספריית הלקוח של Cloud Storage ואת ה-crates התומכים לקובץ Cargo.toml:
cargo add google-cloud-storage anyhow bytes
יצירת סוג שגיאה בהתאמה אישית
כדי לבטל כתיבה של אובייקט לפני הסיום, ההטמעה של StreamingSource צריכה להחזיר שגיאה שמטמיעה את std::error::Error + Send + Sync + 'static. אפשר להשתמש בכל סוג שגיאה קיים שעומד בגבולות האלה, או להגדיר enum בהתאמה אישית לאפליקציה. כדי להגדיר טיפוס enum מותאם אישית של שגיאות:
מגדירים enum של שגיאה בהתאמה אישית (
MyError):מטמיעים את המאפיין הרגיל
Errorכדי שספריית הלקוח תוכל לשמור את השגיאה כסיבה הבסיסית:מטמיעים את המאפיין
Displayשנדרש על ידיstd::error::Error:
הטמעה של מקור סטרימינג בהתאמה אישית
אחר כך יוצרים סוג שמייצר קטעים סינתטיים ומחזיר שגיאה אחרי 41 קטעים, כדי שההעלאה תיפסק לפני שהיא תסתיים. כך עושים את זה:
מגדירים מבנה למעקב אחרי מונה החלקים:
מטמיעים את
StreamingSourceעבורMySource, משייכים אתtype Error = MyErrorומחזירים אתSome(Err(MyError::ExpectedProblem))באיטרציה 42:
כש-next מחזיר את הערך Some(Err(...)), ספריית הלקוח מפסיקה לקרוא מהמקור ומבטלת את בקשת הכתיבה בלי להשלים את האובייקט.
מנסים להעלות את הקובץ ובודקים את השגיאה
אחרי שמטמיעים את StreamingSource, מנסים לכתוב אובייקט במאגר נתונים זמני ומוודאים שהלקוח מחזיר שגיאת סריאליזציה שעוטפת את MyError. מכיוון ש-MySource הוא מקור במעבר יחיד שלא מטמיע את Seek, צריך להתחיל את הכתיבה באמצעות send_buffered במקום send_unbuffered.
בתוך פונקציית async שמקבלת את bucket_name בפורמט projects/_/buckets/BUCKET_ID, מבצעים את הפעולות הבאות:
מאתחלים לקוח
Storage:מתחילים את הכתיבה של האובייקט במאגר הזמני באמצעות
MySource::default()כמטען הייעודי (payload) של המקור:מוודאים שההעלאה נכשלת עם שגיאת סריאליזציה שמקור השגיאה שלה הוא
MyError:מחזירים את
Ok(())כדי להשלים את הפונקציה:
כשמריצים את attempt_upload, מודפסת הודעת Upload result Err(...) שמכילה את MyError::ExpectedProblem. הטענות הנכונות מאמתות שהלקוח הפסיק את ההעלאה והחזיר שגיאת סריאליזציה שעוטפת את MyError. מכיוון שהכתיבה בוטלה לפני הסיום, Cloud Storage לא יוצר את האובייקט expect-error בקטגוריה.
הסרת המשאבים
למרות שהכתיבה שבוטלה לא יוצרת אובייקט, מחקו את כל אובייקטי הבדיקה שיצרתם בשביל המסמך הזה. כדי להימנע מחיובים מתמשכים, מומלץ למחוק את משאבי הבדיקה בסיום.
השלמת הקוד
בדוגמה הבאה משולבים כל השלבים הקודמים במודול שלם: