Виртуальные машины можно приостанавливать, перезапускать, перезагружать и выключать. Когда происходит любое из этих событий, это влияет на издателей, подписчиков, RPC-клиентов и RPC-серверы. На рисунке 1 показан жизненный цикл пакета услуг.
Рисунок 1. Жизненный цикл пакета услуг.
Жизненный цикл пакета услуг состоит из следующих этапов:
- Для создания пакета услуг вызывается метод
new. - Менеджер жизненного цикла запускает пакет сервисов и, в зависимости от настроек в конфигурации оркестрации, вызывает
on_start. - Когда ВМ останавливается или приостанавливается, в зависимости от настроек в конфигурации оркестрации менеджер жизненного цикла вызывает
on_stop. Функцияon_stopдолжна останавливать потоки для издателей, подписчиков, клиентов RPC и серверов RPC. - Когда работа виртуальной машины возобновляется,
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.
Определите доступность сервиса
В примере ниже показано, как использовать 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. Этот поток событий регистрации получает уведомление, когда блок сервиса становится доступным.