טיפול בהשעיה ובהפעלה מחדש

אפשר להשהות, להפעיל מחדש, לאתחל ולכבות מכונות וירטואליות (VM). כשכל אחד מהאירועים האלה מתרחש, הוא משפיע על בעלי אתרים, מנויים, לקוחות RPC ושרתי RPC. איור 1 מציג את מחזור החיים של חבילת שירותים:

מחזור החיים של חבילת שירות

איור 1. מחזור החיים של חבילת שירות.

מחזור החיים של חבילת השירותים מתנהל לפי הרצף הבא:

  1. השיטה new מופעלת כדי ליצור את חבילת השירות.
  2. מנהל מחזור החיים מפעיל את חבילת השירות, ובהתאם להגדרות בהגדרת התזמור, מפעיל את on_start.
  3. כשה-VM נעצר או מושהה, ובאמצעות הגדרות בהגדרת התזמור, מנהל מחזור החיים קורא ל-on_stop. הפונקציה on_stop אמורה לעצור את השרשורים של בעלי תוכן דיגיטלי, מנויים, לקוחות RPC ושרתי RPC.
  4. כשממשיכים את הפעולה של מכונת ה-VM, ‏ on_start יכול ליצור מחדש את השרשורים אם חבילת השירות מוגדרת להפעלה מחדש על ידי הגדרת האורקסטרציה.

יצירת הגדרה לטיפול בהשהיה ובהפעלה מחדש

בדוגמה הבאה מוצגת הגדרה לטיפול בהשעיה ובהפעלה מחדש:

# Start `auto_start` service bundles when system is started.
state {
    condition {
        or {
            power_state: "ON"
            power_state: "POWER_OFF_EXIT"
            power_state: "SUSPEND_TO_RAM_EXIT"
        }
    }
    groups_states { started: "auto_start" }
}

# Stop `auto_start` service bundles when system is suspending to RAM.
state {
    condition {
        or {
            power_state: "SUSPEND_TO_RAM_ENTER"
            power_state: "WAIT_FOR_FINISH"
            power_state: "SUSPEND_TO_RAM_POST_FINISH"
        }
    }
    groups_states { created: "auto_start" }
}

כאשר:

  • WAIT_FOR_FINISH הוא מצב ההפעלה האחרון שבו חבילת השירות צריכה לצפות מסוכני רכב מוגדרים בתוכנה (SDV) להגיב.
  • SUSPEND_TO_RAM_POST_FINISH מציין שאולי סוכני SDV סוגרים או משעים את החיבור כדי שיוכלו לשחזר אותו בצורה מהימנה בהמשך. חשוב לא להסתמך על SUSPEND_TO_RAM_POST_FINISH או על POWER_OFF_POST_FINISH כדי לקרוא ל-onStop בהטמעה של חבילת השירות, אלא להסתמך על SUSPEND_TO_RAM_ENTER,‏ POWER_OFF_ENTER ו-WAIT_FOR_FINISH.

קביעת זמינות השירות

בדוגמה הבאה אפשר לראות איך משתמשים ב-Middleware API בחבילת השירות כדי לקבוע אם יחידת שירות זמינה:

let mut registration_event_stream =  sdv::mw::clientlib::create_server_registration_event_stream(
        sdv_comms,
        // Descriptor of type sdv::mw::clientlib::rpc_descriptor::client::Descriptor
        // that binds a specific RPC client type to a communication channel.
        client_descriptor,
    )
    .await
    .expect("unable to generate a registration event");

match registration_event_stream.next().await {
            Some(sdv::mw::Availability::Available) => {
                info!("{unit_name} became Available.");
                // Create client/subscriber
            }
            Some(sdv::mw::Availability::Unavailable) => {
                info!("{unit_name} became Unavailable.");
                // Destroy client/subscriber
            }
            None => {
                warn!("Registration event stream for {unit_name} terminated.
                Stopping monitoring for this variant.");
            }
        }

create_server_registration_event_stream הוא API של תוכנת ביניים שמשמש ליצירת אירוע שנקרא unit_name. התראות על אירועים בסטרימינג של רישום מתקבלות כשזמינה יחידת שירות.