סקירה כללית של יישומי פלאגין

בדף הזה מוסבר איך לשלב פלאגינים עם מאזני עומסים של אפליקציות ב-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 באופן הבא:

  1. מכינים את קוד הפלאגין באופן הבא:

    1. יוצרים קוד בהתאמה אישית באמצעות אחד מערכות ה-SDK של Proxy-Wasm:

    2. הידור של הקוד למודול Wasm.

    3. מעלים את קוד הפלאגין המקומפל למאגר ב-Artifact Registry.

  2. יוצרים פלאגין שמכיל את קוד הפלאגין שהועלה.

  3. מגדירים את הפלאגין בתוספים של 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 מהתגובה ועובר לקידוד גוף מקוטע.

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