Ciclo de vida dos Reliable Services
Serviços Confiáveis é um dos modelos de programação disponíveis no Azure Service Fabric. Ao aprender sobre o ciclo de vida dos Serviços Confiáveis, é mais importante entender os eventos básicos do ciclo de vida. A ordenação exata dos eventos depende dos detalhes da configuração.
Em geral, o ciclo de vida dos Serviços Confiáveis inclui os seguintes eventos:
- Durante o arranque:
- Os serviços são construídos.
- Os serviços têm a oportunidade de construir e retornar zero ou mais ouvintes.
- Todos os ouvintes retornados são abertos, para comunicação com o serviço.
- O método do
runAsync
serviço é chamado, para que o serviço possa fazer trabalho de longa duração ou em segundo plano.
- Durante o encerramento:
- O token de cancelamento para o qual foi passado
runAsync
é cancelado e os ouvintes são fechados. - O próprio objeto de serviço é destruído.
- O token de cancelamento para o qual foi passado
A ordem dos eventos em Serviços Confiáveis pode mudar ligeiramente dependendo se o serviço confiável é stateless ou stateful.
Além disso, para serviços com monitoração de estado, você deve abordar o cenário de permuta principal. Durante essa sequência, a função de primário é transferida para outra réplica (ou retorna) sem que o serviço seja desligado.
Finalmente, você tem que pensar sobre as condições de erro ou falha.
Inicialização de serviço sem estado
O ciclo de vida de um serviço sem estado é bastante simples. Eis a ordem dos eventos:
- O serviço é construído.
StatelessService.createServiceInstanceListeners()
é invocado e todos os ouvintes retornados são abertos.CommunicationListener.openAsync()
é chamado a cada ouvinte.- Depois, em paralelo:
- O método do
runAsync
serviço (StatelessService.runAsync()
) é chamado. - Se presente, o próprio
onOpenAsync
método do serviço é chamado. Especificamente,StatelessService.onOpenAsync()
é chamado. Esta é uma substituição incomum, mas está disponível.
- O método do
Desligamento do serviço sem estado
Ao encerrar um serviço sem monitoração de estado, o mesmo padrão é seguido, mas no sentido inverso:
- Todos os ouvintes abertos são fechados.
CommunicationListener.closeAsync()
é chamado a cada ouvinte. - O token de cancelamento para
runAsync()
o qual foi passado é cancelado. Verificar a propriedade do token deisCancelled
cancelamento retornatrue
e, se chamado, o método dothrowIfCancellationRequested
token lança umCancellationException
arquivo . - Quando
runAsync()
termina, o método doStatelessService.onCloseAsync()
serviço é chamado, se estiver presente. Novamente, essa não é uma substituição comum, mas pode ser usada para fechar recursos com segurança, interromper o processamento em segundo plano, terminar de salvar o estado externo ou fechar conexões existentes. - Após
StatelessService.onCloseAsync()
a conclusão, o objeto de serviço é destruído.
Inicialização de serviço com monitoração de estado
Os serviços com estado têm um padrão semelhante aos serviços sem estado, com algumas alterações. Eis a ordem dos eventos para iniciar um serviço com monitoração de estado:
- O serviço é construído.
StatefulServiceBase.onOpenAsync()
é chamado. Essa chamada geralmente não é substituída no serviço.StatefulServiceBase.createServiceReplicaListeners()
é invocado.- Se o serviço for um serviço principal, todos os ouvintes retornados serão abertos.
CommunicationListener.openAsync()
é chamado a cada ouvinte. - Se o serviço for um serviço secundário, apenas os ouvintes marcados como
listenOnSecondary = true
serão abertos. Ter ouvintes abertos em secundárias é menos comum.
- Se o serviço for um serviço principal, todos os ouvintes retornados serão abertos.
- Depois, em paralelo:
- Se o serviço for atualmente um primário, o método do
StatefulServiceBase.runAsync()
serviço será chamado. StatefulServiceBase.onChangeRoleAsync()
é chamado. Essa chamada geralmente não é substituída no serviço.
- Se o serviço for atualmente um primário, o método do
Nota
Para uma nova réplica secundária, StatefulServiceBase.onChangeRoleAsync()
é chamado duas vezes. Uma vez após o passo 2, quando se torna um secundário ocioso e novamente durante o passo 4, quando se torna um secundário ativo. Para obter mais informações sobre o ciclo de vida da réplica e da instância, leia Ciclo de vida da réplica e da instância.
Desligamento do serviço com estado
Como os serviços sem monitoração de estado, os eventos do ciclo de vida durante o desligamento são os mesmos que durante a inicialização, mas invertidos. Quando um serviço com monitoração de estado está sendo encerrado, ocorrem os seguintes eventos:
- Todos os ouvintes abertos são fechados.
CommunicationListener.closeAsync()
é chamado a cada ouvinte. - O token de cancelamento para
runAsync()
o qual foi passado é cancelado. Uma chamada para o método do token deisCancelled()
cancelamento retornatrue
e, se chamado, o método dothrowIfCancellationRequested()
token lança umOperationCanceledException
arquivo . O Service Fabric aguardarunAsync()
a conclusão.
Nota
Esperar pela runAsync
conclusão é necessário somente se essa réplica for uma réplica primária.
- Após
runAsync()
a conclusão, o método doStatefulServiceBase.onCloseAsync()
serviço é chamado. Esta chamada é uma substituição incomum, mas está disponível. - Após
StatefulServiceBase.onCloseAsync()
a conclusão, o objeto de serviço é destruído.
Trocas primárias de serviço com estado
Enquanto um serviço com estado está em execução, os ouvintes de comunicação são abertos e o runAsync
método é chamado apenas para as réplicas primárias desses serviços com monitoração de estado. Réplicas secundárias são construídas, mas não há mais chamadas. Enquanto um serviço com monitoração de estado está em execução, a réplica que é atualmente a principal pode mudar. Os eventos de ciclo de vida que uma réplica com estado pode ver dependem se é a réplica que está sendo rebaixada ou promovida durante a troca.
Para a primária rebaixada
O Service Fabric precisa da réplica principal rebaixada para interromper o processamento de mensagens e qualquer trabalho em segundo plano. Esta etapa é semelhante a quando o serviço é desligado. Uma diferença é que o serviço não é destruído ou fechado, porque permanece como secundário. Ocorrem os seguintes eventos:
- Todos os ouvintes abertos são fechados.
CommunicationListener.closeAsync()
é chamado a cada ouvinte. - O token de cancelamento para
runAsync()
o qual foi passado é cancelado. Uma verificação do método do tokenisCancelled()
de cancelamento retornatrue
. Se chamado, o método dothrowIfCancellationRequested()
token lança umOperationCanceledException
arquivo . O Service Fabric aguardarunAsync()
a conclusão. - Os ouvintes marcados como listenOnSecondary = true são abertos.
- O serviço
StatefulServiceBase.onChangeRoleAsync()
é chamado. Essa chamada geralmente não é substituída no serviço.
Para o secundário promovido
Da mesma forma, o Service Fabric precisa da réplica secundária promovida para começar a ouvir mensagens no fio e para iniciar quaisquer tarefas em segundo plano que precise ser concluída. Este processo é semelhante a quando o serviço é criado. A diferença é que a réplica em si já existe. Ocorrem os seguintes eventos:
CommunicationListener.closeAsync()
é chamado para todos os ouvintes abertos (marcado com listenOnSecondary = true)- Todos os ouvintes de comunicação estão abertos.
CommunicationListener.openAsync()
é chamado a cada ouvinte. - Depois, em paralelo:
- O método do
StatefulServiceBase.runAsync()
serviço é chamado. StatefulServiceBase.onChangeRoleAsync()
é chamado. Essa chamada geralmente não é substituída no serviço.
- O método do
Nota
createServiceReplicaListeners
é chamado apenas uma vez e não é chamado novamente durante o processo de promoção ou rebaixamento da réplica; As mesmas ServiceReplicaListener
instâncias são usadas, mas novas CommunicationListener
instâncias são criadas (chamando o ServiceReplicaListener.createCommunicationListener
método) depois que as instâncias anteriores são fechadas.
Problemas comuns durante o desligamento do serviço com monitoração de estado e o rebaixamento primário
O Service Fabric altera o principal de um serviço com monitoração de estado por vários motivos. Os motivos mais comuns são o rebalanceamento de cluster e a atualização de aplicativos. Durante essas operações, é importante que o serviço respeite o cancellationToken
. Isso também se aplica durante o desligamento normal do serviço, como se o serviço fosse excluído.
Os serviços que não lidam com o cancelamento de forma limpa podem ter vários problemas. Essas operações são lentas porque o Service Fabric aguarda que os serviços parem normalmente. Isso pode, em última análise, levar a atualizações com falha que expiram e revertem. O não cumprimento do token de cancelamento também pode causar clusters desequilibrados. Os clusters ficam desequilibrados porque os nós ficam quentes. No entanto, os serviços não podem ser reequilibrados porque leva muito tempo para movê-los para outro lugar.
Como os serviços são com monitoração de estado, também é provável que os serviços usem Coleções Confiáveis. No Service Fabric, quando um primário é rebaixado, uma das primeiras coisas que acontece é que o acesso de gravação ao estado subjacente é revogado. Isso leva a um segundo conjunto de problemas que podem afetar o ciclo de vida do serviço. As coleções retornam exceções com base no tempo e se a réplica está sendo movida ou encerrada. É importante lidar com essas exceções corretamente.
As exceções geradas pelo Service Fabric são permanentes (FabricException
) ou transitórias (FabricTransientException
). Exceções permanentes devem ser registradas e lançadas. Exceções transitórias podem ser repetidas com base na lógica de repetição.
Uma parte importante do teste e da validação dos Serviços Confiáveis é lidar com as exceções decorrentes do uso do em conjunto com eventos do ciclo de vida do ReliableCollections
serviço. Recomendamos que você sempre execute seu serviço sob carga. Você também deve executar atualizações e testes de caos antes de implantar na produção. Estas etapas básicas ajudam a garantir que seu serviço seja implementado corretamente e que ele lide com eventos do ciclo de vida corretamente.
Notas sobre o ciclo de vida do serviço
- Tanto o
runAsync()
método como ascreateServiceInstanceListeners/createServiceReplicaListeners
chamadas são opcionais. Um serviço pode ter um, ambos ou nenhum. Por exemplo, se o serviço faz todo o seu trabalho em resposta a chamadas de usuários, não há necessidade de implementarrunAsync()
o . Apenas os ouvintes de comunicação e seu código associado são necessários. Da mesma forma, criar e retornar ouvintes de comunicação é opcional. O serviço pode ter apenas trabalho em segundo plano para fazer, por isso só precisa implementarrunAsync()
. - É válido para que um serviço seja concluído
runAsync()
com sucesso e retorne dele. Esta não é considerada uma condição de falha. Ele representa o trabalho de fundo do acabamento do serviço. Para Serviços Confiáveis com monitoração de estado,runAsync()
será chamado novamente se o serviço for rebaixado de primário e, em seguida, promovido de volta para primário. - Se um serviço sair lançando
runAsync()
alguma exceção inesperada, isso é uma falha. O objeto de serviço é desligado e um erro de integridade é relatado. - Embora não haja limite de tempo para retornar desses métodos, você perde imediatamente a capacidade de escrever. Portanto, você não pode concluir nenhum trabalho real. Recomendamos que devolva o mais rapidamente possível após receber o pedido de cancelamento. Se o seu serviço não responder a essas chamadas de API em um período de tempo razoável, o Service Fabric poderá encerrar o serviço à força. Normalmente, isso acontece apenas durante atualizações de aplicativos ou quando um serviço está sendo excluído. Esse tempo limite é de 15 minutos por padrão.
- Falhas no
onCloseAsync()
caminho resultam emonAbort()
ser chamado. Esta chamada é uma oportunidade de última chance e melhor esforço para o serviço limpar e liberar quaisquer recursos que eles reivindicaram. Isso geralmente é chamado quando uma falha permanente é detetada no nó ou quando o Service Fabric não pode gerenciar de forma confiável o ciclo de vida da instância de serviço devido a falhas internas. OnChangeRoleAsync()
é chamado quando a réplica de serviço com monitoração de estado está mudando de função, por exemplo, para primária ou secundária. As réplicas primárias recebem status de gravação (têm permissão para criar e gravar em Coleções Confiáveis). As réplicas secundárias recebem status de leitura (só podem ser lidas a partir de Coleções Confiáveis existentes). A maior parte do trabalho em um serviço com monitoração de estado é executada na réplica principal. As réplicas secundárias podem executar validação somente leitura, geração de relatórios, mineração de dados ou outros trabalhos somente leitura.