בדף הזה מוסבר איך לשלב פלאגינים עם מאזני עומסים של אפליקציות ב-Cloud Load Balancing ועם Media CDN.
התכונה הזו נמצאת בגרסת טרום-השקה (Preview) ב-Media CDN.
הפלאגינים נוצרים בפורמט WebAssembly (Wasm) ומשתמשים בממשקי Proxy-Wasm API.
Wasm הוא פורמט פתוח וסטנדרטי של הוראות בינאריות, שמאפשר למארח לטעון ולהריץ מודולים של Wasm עם קוד שהלקוח מספק. ל-Wasm יש כמה יתרונות בהרצת קוד של לקוחות, כולל ארגז חול (sandbox) לאבטחה, תמיכה בכמה שפות, ניידות, תמיכה רחבה וצומחת בתחום וביצועים משופרים ביחס לאפשרויות אחרות שמבוססות על מכונות וירטואליות (VM), כמו JavaScript.
Proxy-Wasm הוא פרויקט קוד פתוח ש-Google התחילה. הוא מגדיר ממשקי API שמאפשרים להתאים אישית את ההתנהגות של שרתי proxy ברשת, על ידי הטמעה של פונקציות קריאה חוזרת (callback) שיופעלו במהלך העיבוד של בקשות ותגובות HTTP.
איך פלאגינים פועלים
אתם יכולים להשתמש בתוספים לשירות עם מאזני עומסים של אפליקציות ועם Media CDN באופן הבא:
מכינים את קוד הפלאגין באופן הבא:
יוצרים פלאגין שמכיל את קוד הפלאגין שהועלה.
מגדירים את הפלאגין בתוספים של Cloud Load Balancing או בתוספים של Media CDN.
מקורות מידע על פלאגינים
בעזרת Service Extensions אפשר ליצור את המשאבים העיקריים הבאים, שמאפשרים להוסיף קוד בהתאמה אישית לנתיב העיבוד:
פלאגינים, שמכילים את הקוד בהתאמה אישית שרוצים לפרוס.
גרסאות פלאגין, שהן גרסאות של מודול ה-Wasm. אתם יכולים לציין איזו גרסה של מודול ה-Wasm תשמש כגרסה הראשית (הפעילה) של הפלאגין.
גישה למאפיינים בפלאגינים
פלאגינים של Wasm יכולים לגשת למאפיינים שהועברו באמצעות קריאת ה-ABI proxy_get_property, שהיא חלק מה-ABI של Proxy-Wasm. שם המאפיין שאפשר לאחזר תואם לשם המאפיין.
אפשר לגשת למאפיינים כייצוג נתיב של שם המאפיין. לדוגמה, כדי לאחזר את request.host, אפשר להשתמש בייצוג נתיב כמו {"request", "host"}.
בדוגמה הבאה, שכתובה ב-Rust, אפשר לראות איך ניגשים למאפיינים שהועברו בהטמעה של HttpContext:
use proxy_wasm::traits::{HttpContext, RootContext}; use proxy_wasm::types::Action; // ... inside your HttpContext implementation ... fn on_request_headers(&mut self, _num_headers: usize, _end_of_stream: bool) -> Action { if let Some(host) = self.get_property(vec!["request", "host"]) { // host is a Vec, convert to string let host_str = String::from_utf8(host).unwrap_or_default(); log::info!("Request host: {}", host_str); } if let Some(region) = self.get_property(vec!["source", "client_region"]) { let region_str = String::from_utf8(region).unwrap_or_default(); log::info!("Client region: {}", region_str); } Action::Continue }
מגבלות
בקטע הזה מפורטות כמה מגבלות שקשורות לפלאגינים.
מגבלות על משאבים
התוספים מוגבלים מאוד בכמות המשאבים שהם יכולים להשתמש בהם:
פלאגין יכול להשתמש בעד 1 אלפית השנייה של vCPU מנורמל לכל הפעלה. אלפית השנייה של מעבד תלויה בפלטפורמה, אבל הפלטפורמה המנורמלת שווה בערך למעבד עם מהירות שעון של 4GHz. הפעלה היא שלב בביצוע שמחויב בנפרד, ויכול להיות כותרות של בקשה, גוף של בקשה, כותרות של תגובה או גוף של תגובה.
פלאגין יכול להשתמש בזיכרון של עד 16MiB לכל מכונה וירטואלית (4MiB לפלאגינים של Media CDN).
מכונה צריכה להיות מסוגלת לשרת עד 1,000 בקשות מקבילות, כלומר פלאגין יכול להחזיק עד 16KiB של זיכרון לכל סטרימינג (4KiB לפלאגינים של Media CDN). השימוש הכולל בזיכרון כולל את המצב הגלובלי ואת הקצאות הסטאק. פלאגינים שחורגים מהמגבלה הזו נסגרים.
פלאגינים שנוצרו ב-C++ וב-Rust משתמשים בכמות הזיכרון שבשימוש הקטנה ביותר. אנחנו לא ממליצים להשתמש ב-Go SDK ל-Media CDN, כי סביבת זמן הריצה של Go ואיסוף האשפה דורשים זיכרון בסיסי מינימלי של 2-3MiB.
משתמשים בכלי לבדיקת פלאגינים כדי לבדוק את מאפייני המעבד (CPU) והזיכרון של הפלאגין.
מגבלות על ממשקי API
פלאגינים יכולים להשתמש בקבוצת משנה של Proxy-Wasm ABI. הפלאגינים לא תומכים בטיימרים, במדדים מותאמים אישית, בנתונים משותפים, בתורים משותפים או בשיחות רשת יוצאות.
אין תמיכה באירועי טריילר של HTTP.
מגבלות על שינוי כותרות
הגודל המקסימלי של כל מוטציה (כותרות או חלקי גוף) הוא 128 KiB.
פלאגינים לא יכולים לשנות את מצב העיבוד של הסטרימינג של
ext_proc.בחלק מהכותרות אין תמיכה בשינוי כותרות באמצעות פלאגינים. המעבד מתעלם מכל שינוי בכותרות האלה וממשיך לעבד את הבקשה.
אין תמיכה בפלאגינים הבאים של Media CDN:
- כותרות:
CDN-Loop,connection,keep-alive,proxy-authenticate,proxy-authorization,proxy-connection,te,trailers,transfer-encoding,upgradeאוX-user-IP. - כותרות שמתחילות ב:
x-forwarded,x-goog-,x-google,x-gfeאוx-amz-.
בפלאגינים של Cloud Load Balancing, אין תמיכה באפשרויות הבאות:
כותרות:
connection,keep-alive,proxy-authenticate,proxy-authorization,proxy-connection,sec-user-ip,te,trailer,transfer-encoding,upgrade,x-dont-count-ads,x-dont-show-ads,x-gr,x-proxyuser-ipאוx-user-ip.בנוסף, ב-
LbTrafficExtensionאין תמיכה בכותרות הבאות:method,authority,schemeאו כותרות מארח.כותרות שמתחילות ב-
sec-gfe-,sec-google-,x-amz-,x-forwarded-,x-gfe-,x-goog-,x-google-אוx-gproxy-.
- כותרות:
מגבלות בלקוחות ובקצוות עורפיים של HTTP/1.1
כשמגדירים את REQUEST_BODY או את RESPONSE_BODY לתוסף, אם מאזן העומסים מקבל בקשה שמולאה, הוא מסיר את הכותרת Content-Length מהתגובה ועובר לקידוד גוף מקוטע.