הלקוח של Cloud Storage בספריות הלקוח ב-Cloud ל-Rust כותב אובייקטים על ידי משיכת קטעי מטען ייעודי (payload) מסוג שמטמיע את המאפיין StreamingSource.
חלק מהאפליקציות יוצרות נתונים במשימה או בשרשור נפרדים, וצריכות לדחוף חלקי מטען ייעודי (payload) להעלאה.
במאמר הזה מוסבר איך לעטוף מקלט ערוץ אסינכרוני בהטמעה של StreamingSource כדי שתוכלו לדחוף נתונים לכתיבת אובייקט ב-Cloud Storage. אם אתם משתמשים חדשים בספריית הלקוח, קודם קראו את המאמר שימוש ב-Cloud Storage עם Rust.
לפני שמתחילים
לפני שמריצים את הקוד במסמך הזה, צריך להשלים את הדרישות המוקדמות הבאות:
- יוצרים או בוחרים פרויקט ב-Google Cloud שהחיוב מופעל בו.
- יוצרים קטגוריה של Cloud Storage בפרויקט.
- מגדירים Application Default Credentials ונותנים לחשבון הראשי תפקיד בניהול זהויות והרשאות גישה (IAM) עם הרשאה ליצור אובייקטים בקטגוריה, כמו Storage Object User (
roles/storage.objectUser).
יחסי תלות
מוסיפים לקובץ Cargo.toml את ספריית הלקוח של Cloud Storage ואת ה-crates התומכים שמופיעים במסמך הזה:
cargo add google-cloud-storage anyhow bytes
cargo add tokio --features rt,sync
המרת מקלט של תור למקור סטרימינג
כדי להפריד בין המשימה שמפיקה את הנתונים לבין המשימה שמעלה את המטען הייעודי (payload), חברו אותן באמצעות תור אסינכרוני. במסמך הזה אנחנו משתמשים בערוץ mpsc של Tokio, אבל אתם יכולים להשתמש בכל ערוץ או תור שמשתלבים עם זמן הריצה האסינכרוני שלכם.
כדי להתאים את מקלט הערוץ להטמעה של StreamingSource, מבצעים את השלבים הבאים:
מגדירים מבנה שעוטף את הערוץ
Receiver:מטמיעים את המאפיין
StreamingSourceעבור ה-struct של ה-wrapper, כך שכל קריאה ל-nextתמתין לחלק הבא מהמקבל:
העברת נתונים בסטרימינג מהתור אל Cloud Storage
אחרי שמטמיעים את המאפיין StreamingSource, אפשר להפעיל את העלאת האובייקט במשימה ברקע ולשלוח מקטעים דרך הערוץ ממשימת ה-producer. מכיוון שמקלט הערוץ הוא מקור נתונים במעבר יחיד שלא מטמיע את Seek, צריך להתחיל את ההעלאה באמצעות send_buffered במקום send_unbuffered.
בתוך פונקציית async שמקבלת את bucket_name בפורמט projects/_/buckets/BUCKET_ID ו-object_name, מבצעים את הפעולות הבאות:
מאתחלים לקוח
Storage:יוצרים ערוץ
mpscמוגבל כדי לקבל את נקודות האחיזהsenderו-receiver:מגדירים את העלאת האובייקט עם
QueueSource(receiver)כמקור המטען הייעודי (payload). אל תחכו עדיין לעתיד שלsend_buffered:מפעילים משימה ברקע כדי להעלות את הנתונים בזמן שהיצרן יוצר אותם:
במשימת ה-producer, דוחפים מקטעי נתונים לכינוי
sender:אחרי ששולחים את כל הנתונים, סוגרים את הערוץ באמצעות ה-handle של
senderומסמנים את סוף הסטרימינג של האובייקט:ממתינים לטיפול במשימה ברקע כדי לוודא שהמשימה ובקשת ההעלאה הצליחו, ומאחזרים את המטא-נתונים של
Objectשהועלו:
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם במסמך הזה, מחקו את אובייקטי הבדיקה שהעליתם כשתסיימו.
השלמת הקוד
בדוגמה הבאה משולבים כל השלבים הקודמים לפונקציה מלאה: