As máquinas virtuais (VMs) podem ser suspensas, retomadas, reinicializadas e desligadas. Quando qualquer um desses eventos ocorre, publishers, assinantes, clientes e servidores RPC são afetados. A Figura 1 mostra o ciclo de vida de um pacote de serviços:
Figura 1. Ciclo de vida de um pacote de serviços.
O ciclo de vida do pacote de serviços segue esta sequência:
- O método
newé chamado para criar o pacote de serviços. - O gerenciador de ciclo de vida inicia o pacote de serviços e, dependendo das configurações
na configuração de orquestração, chama
on_start. - Quando a VM é interrompida ou suspensa e, dependendo das configurações na
configuração de orquestração, o gerenciador de ciclo de vida chama
on_stop. A funçãoon_stopprecisa interromper as linhas de execução de editores, assinantes, clientes e servidores RPC. - Quando a VM é retomada, o
on_startpode recriar as linhas de execução se o pacote de serviços estiver configurado para ser iniciado novamente pela configuração de orquestração.
Criar uma configuração para processar suspensão e retomada
O exemplo a seguir mostra uma configuração para processar suspensão e retomada:
# 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" }
}
Em que:
WAIT_FOR_FINISHé o último estado de energia em que o pacote de serviços deve esperar que os agentes de veículo definido por software (SDV) respondam.SUSPEND_TO_RAM_POST_FINISHindica que os agentes de SDV podem estar fechando ou suspendendo a conexão para poder restaurá-los de forma confiável ao retomar. É importante não depender deSUSPEND_TO_RAM_POST_FINISHouPOWER_OFF_POST_FINISHpara chamaronStopna implementação do pacote de serviços e, em vez disso, depender deSUSPEND_TO_RAM_ENTER,POWER_OFF_ENTEReWAIT_FOR_FINISH.
Determinar a disponibilidade do serviço
O exemplo a seguir mostra como usar a API de middleware no pacote de serviços para determinar se uma unidade de serviço está disponível:
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.");
}
}
O create_server_registration_event_stream é uma API de middleware usada para
criar um evento chamado unit_name. Esse fluxo de eventos de registro é notificado
quando uma unidade de serviço fica disponível.