Maszyny wirtualne można wstrzymywać, wznawiać, ponownie uruchamiać i wyłączać. Gdy wystąpi któreś z tych zdarzeń, ma to wpływ na wydawców, subskrybentów, klientów RPC i serwery RPC. Rysunek 1 przedstawia cykl życia pakietu usług:
Rysunek 1. Cykl życia pakietu usług.
Cykl życia pakietu usług przebiega w tej kolejności:
- Wywoływana jest metoda
neww celu utworzenia pakietu usług. - Menedżer cyklu życia uruchamia pakiet usług i w zależności od ustawień w konfiguracji orkiestracji wywołuje metodę
on_start. - Gdy maszyna wirtualna zatrzyma się lub zostanie wstrzymana, a w zależności od ustawień w konfiguracji orkiestracji menedżer cyklu życia wywołuje metodę
on_stop. Funkcjaon_stoppowinna zatrzymać wątki wydawców, subskrybentów, klientów RPC i serwerów RPC. - Gdy maszyna wirtualna zostanie wznowiona, metoda
on_startmoże ponownie utworzyć wątki, jeśli pakiet usług jest skonfigurowany tak, aby można go było ponownie uruchomić za pomocą konfiguracji orkiestracji.
Tworzenie konfiguracji do obsługi wstrzymywania i wznawiania
Poniższy przykład pokazuje konfigurację do obsługi wstrzymywania i wznawiania:
# 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" }
}
Gdzie:
WAIT_FOR_FINISHto ostatni stan zasilania, w którym pakiet usług powinien oczekiwać, że agenty SDV będą odpowiadać.SUSPEND_TO_RAM_POST_FINISHoznacza, że agenty SDV mogą zamykać lub wstrzymywać połączenie, aby można je było niezawodnie przywrócić po wznowieniu. Ważne jest, aby nie polegać naSUSPEND_TO_RAM_POST_FINISHaniPOWER_OFF_POST_FINISHw celu wywołaniaonStopw implementacji pakietu usług, ale zamiast tego polegać naSUSPEND_TO_RAM_ENTER,POWER_OFF_ENTERiWAIT_FOR_FINISH.
Określanie dostępności usługi
Poniższy przykład pokazuje, jak używać interfejsu API oprogramowania pośredniczącego w pakiecie usług, aby określić, czy jednostka usługi jest dostępna:
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 to interfejs API oprogramowania pośredniczącego, który służy do tworzenia zdarzenia o nazwie unit_name. Ten strumień zdarzeń rejestracji jest powiadamiany, gdy jednostka usługi stanie się dostępna.