Descrição geral do Reliable Services
O Azure Service Fabric simplifica a escrita e o gerenciamento de serviços sem monitoração de estado e com monitoração de estado. Este tópico abrange:
- O modelo de programação de Serviços Confiáveis para serviços sem estado e com monitoração de estado.
- As escolhas que você tem que fazer ao escrever um Serviço Confiável.
- Alguns cenários e exemplos de quando usar os Serviços Confiáveis e como eles são escritos.
Serviços confiáveis é um dos modelos de programação disponíveis no Service Fabric. Outro é o modelo de programação Reliable Ator , que fornece uma estrutura de aplicação Virtual Ator em cima do modelo Reliable Services. Para obter mais informações sobre atores confiáveis, consulte Introdução aos atores confiáveis do Service Fabric.
O Service Fabric gerencia o tempo de vida dos serviços, desde o provisionamento e a implantação até a atualização e a exclusão, por meio do gerenciamento de aplicativos do Service Fabric.
O que são serviços confiáveis
O Reliable Services oferece um modelo de programação simples, poderoso e de alto nível para ajudá-lo a expressar o que é importante para seu aplicativo. Com o modelo de programação de Serviços Confiáveis, você obtém:
- Acesso às APIs do Service Fabric. Ao contrário dos serviços do Service Fabric modelados como executáveis convidados, os Serviços Confiáveis podem usar APIs do Service Fabric diretamente. Isso permite que os serviços:
- Consultar o sistema
- Relatar integridade sobre entidades no cluster
- Receba notificações sobre alterações de configuração e código
- Encontre e comunique com outros serviços,
- Use as coleções confiáveis
- Aceda a muitas outras capacidades, tudo a partir de um modelo de programação de primeira classe em várias linguagens de programação.
- Um modelo simples para executar seu próprio código que se parece com outros modelos de programação familiares. Seu código tem um ponto de entrada bem definido e um ciclo de vida facilmente gerenciado.
- Um modelo de comunicação conectável. Use o transporte de sua escolha, como HTTP com API da Web, WebSockets, protocolos TCP personalizados ou qualquer outra coisa. Serviços confiáveis fornecem algumas ótimas opções prontas para uso ou você pode fornecer as suas.
- Para serviços com monitoração de estado, o modelo de programação de Serviços Confiáveis permite que você armazene seu estado de forma consistente e confiável dentro do seu serviço usando Coleções Confiáveis. Coleções confiáveis são um conjunto simples de classes de coleção altamente disponíveis e confiáveis que serão familiares para qualquer pessoa que tenha usado coleções C#. Tradicionalmente, os serviços necessitavam de sistemas externos para uma gestão fiável do Estado. Com as Coleções Confiáveis, você pode armazenar seu estado ao lado de sua computação com a mesma alta disponibilidade e confiabilidade que você espera de lojas externas altamente disponíveis. Esse modelo também melhora a latência porque você está colocalizando a computação e afirma que ela precisa funcionar.
O que torna os Serviços Fiáveis diferentes
Os Serviços Confiáveis são diferentes dos serviços que você pode ter escrito antes, porque o Service Fabric fornece:
- Confiabilidade - Seu serviço permanece ativo mesmo em ambientes não confiáveis onde suas máquinas falham ou atingem problemas de rede, ou em casos em que os próprios serviços encontram erros e falham ou falham. Para serviços com monitoração de estado, seu estado é preservado mesmo na presença de falhas de rede ou outras.
- Disponibilidade - O seu serviço é acessível e responsivo. O Service Fabric mantém o número desejado de cópias em execução.
- Escalabilidade - Os serviços são dissociados de hardware específico e podem crescer ou diminuir conforme necessário através da adição ou remoção de hardware ou outros recursos. Os serviços são facilmente particionados (especialmente no caso com monitoração de estado) para garantir que o serviço possa ser dimensionado e lidar com falhas parciais. Os serviços podem ser criados e excluídos dinamicamente por meio de código, permitindo que mais instâncias sejam criadas conforme necessário, por exemplo, em resposta às solicitações dos clientes. Por fim, o Service Fabric incentiva que os serviços sejam leves. O Service Fabric permite que milhares de serviços sejam provisionados em um único processo, em vez de exigir ou dedicar instâncias ou processos inteiros do sistema operacional a uma única instância de um serviço.
- Consistência - Qualquer informação armazenada em um Serviço Confiável pode ser garantida como consistente. Isso é verdade mesmo em várias coleções confiáveis dentro de um serviço. As alterações nas coleções dentro de um serviço podem ser feitas de forma transacionalmente atômica.
Ciclo de vida do serviço
Quer o seu serviço seja stateful ou stateless, os Reliable Services fornecem um ciclo de vida simples que lhe permite ligar rapidamente o seu código e começar. Para colocar um novo serviço em funcionamento, você implemente dois métodos:
- CreateServiceReplicaListeners/CreateServiceInstanceListeners - Este método é onde o serviço define a(s) pilha(s) de comunicação que deseja usar. A pilha de comunicação, como a API da Web, é o que define o ponto de extremidade de escuta ou pontos de extremidade para o serviço (como os clientes acessam o serviço). Ele também define como as mensagens que aparecem interagem com o resto do código de serviço.
- RunAsync - Este método é onde o serviço executa sua lógica de negócios e onde ele iniciaria quaisquer tarefas em segundo plano que devem ser executadas durante o tempo de vida do serviço. O token de cancelamento fornecido é um sinal de quando esse trabalho deve parar. Por exemplo, se o serviço precisar retirar mensagens de uma fila confiável e processá-las, é aqui que esse trabalho acontece.
Se você está aprendendo sobre serviços confiáveis pela primeira vez, continue a leitura! Se você estiver procurando um passo a passo detalhado do ciclo de vida de serviços confiáveis, confira Visão geral do ciclo de vida de Serviços confiáveis.
Exemplos de serviços
Vamos dar uma olhada mais de perto como o modelo de Serviços Confiáveis funciona com serviços sem estado e com monitoração de estado.
Serviços confiáveis sem estado
Um serviço sem estado é aquele em que não há nenhum estado mantido dentro do serviço em chamadas. Qualquer estado presente é totalmente descartável e não requer sincronização, replicação, persistência ou alta disponibilidade.
Por exemplo, considere uma calculadora que não tem memória e recebe todos os termos e operações para executar de uma só vez.
Nesse caso, o RunAsync()
(C#) ou runAsync()
(Java) do serviço pode estar vazio, uma vez que não há processamento de tarefas em segundo plano que o serviço precise fazer. Quando o serviço de calculadora é criado, ele retorna um ICommunicationListener
(C#) ou CommunicationListener
(Java) (por exemplo , API da Web) que abre um ponto de extremidade de escuta em alguma porta. Esse ponto de extremidade de escuta se conecta aos diferentes métodos de cálculo (exemplo: "Add(n1, n2)") que definem a API pública da calculadora.
Quando uma chamada é feita de um cliente, o método apropriado é invocado e o serviço de calculadora executa as operações nos dados fornecidos e retorna o resultado. Ele não armazena nenhum estado.
Não armazenar nenhum estado interno torna este exemplo de calculadora simples. Mas a maioria dos serviços não é verdadeiramente apátrida. Em vez disso, eles externalizam seu estado para alguma outra loja. (Por exemplo, qualquer aplicativo Web que dependa de manter o estado da sessão em um armazenamento de backup ou cache não é sem monitoração de estado.)
Um exemplo comum de como os serviços sem estado são usados no Service Fabric é como um front-end que expõe a API voltada para o público de um aplicativo Web. Em seguida, o serviço front-end conversa com os serviços com monitoração de estado para concluir uma solicitação do usuário. Nesse caso, as chamadas dos clientes são direcionadas para uma porta conhecida, como a 80, onde o serviço sem estado está escutando. Esse serviço sem monitoração de estado recebe a chamada e determina se a chamada é de uma parte confiável e a qual serviço ela se destina. Em seguida, o serviço sem estado encaminha a chamada para a partição correta do serviço com estado e aguarda uma resposta. Quando o serviço sem estado recebe uma resposta, ele responde ao cliente original. Um exemplo desse serviço é o exemplo de Introdução do Service Fabric (C# / Java), entre outros exemplos do Service Fabric nesse repositório.
Serviços confiáveis com estado
Um serviço stateful é aquele que deve ter alguma parcela do estado mantida consistente e presente para que o serviço funcione. Considere um serviço que calcula constantemente uma média móvel de algum valor com base nas atualizações recebidas. Para fazer isso, ele deve ter o conjunto atual de solicitações de entrada que precisa processar e a média atual. Qualquer serviço que recupere, processe e armazene informações em um repositório externo (como um blob do Azure ou um repositório de tabelas hoje) tem monitoração de estado. Ele apenas mantém seu estado no armazenamento de estado externo.
Atualmente, a maioria dos serviços armazena seu estado externamente, uma vez que o armazenamento externo é o que fornece confiabilidade, disponibilidade, escalabilidade e consistência para esse estado. No Service Fabric, os serviços não precisam armazenar seu estado externamente. O Service Fabric cuida desses requisitos para o código de serviço e o estado do serviço.
Digamos que queremos escrever um serviço que processe imagens. Para fazer isso, o serviço recebe uma imagem e a série de conversões para executar nessa imagem. Este serviço retorna um ouvinte de comunicação (vamos supor que seja uma WebAPI) que expõe uma API como ConvertImage(Image i, IList<Conversion> conversions)
. Quando recebe uma solicitação, o serviço a armazena em um IReliableQueue
, e retorna alguma ID para o cliente para que ele possa rastrear a solicitação.
Neste serviço, RunAsync()
poderia ser mais complexo. O serviço tem um loop dentro RunAsync()
dele que extrai solicitações e IReliableQueue
executa as conversões solicitadas. Os resultados são armazenados em um IReliableDictionary
para que, quando o cliente voltar, eles possam obter suas imagens convertidas. Para garantir que, mesmo que algo falhe, a imagem não seja perdida, esse Serviço Confiável sairá da fila, executará as conversões e armazenará o resultado em uma única transação. Nesse caso, a mensagem é removida da fila e os resultados são armazenados no dicionário de resultados somente quando as conversões são concluídas. Como alternativa, o serviço pode retirar a imagem da fila e armazená-la imediatamente em um armazenamento remoto. Isso reduz a quantidade de estado que o serviço precisa gerenciar, mas aumenta a complexidade, já que o serviço precisa manter os metadados necessários para gerenciar o armazenamento remoto. Com qualquer uma das abordagens, se algo falhar no meio, a solicitação permanece na fila esperando para ser processada.
Embora esse serviço pareça um serviço .NET típico, a diferença é que as estruturas de dados que estão sendo usadas (IReliableQueue
e IReliableDictionary
) são fornecidas pelo Service Fabric e são altamente confiáveis, disponíveis e consistentes.
Quando usar APIs de Serviços Confiáveis
Considere APIs de serviços confiáveis se:
- Você quer que o código do seu serviço (e, opcionalmente, o estado) seja altamente disponível e confiável.
- Você precisa de garantias transacionais em várias unidades de estado (por exemplo, ordens e itens de linha de ordem).
- O estado do seu aplicativo pode ser naturalmente modelado como Dicionários e Filas Confiáveis.
- O código ou o estado de seus aplicativos precisa estar altamente disponível com leituras e gravações de baixa latência.
- Seu aplicativo precisa controlar a simultaneidade ou granularidade das operações transacionadas em uma ou mais Coleções Confiáveis.
- Você deseja gerenciar as comunicações ou controlar o esquema de particionamento para o seu serviço.
- Seu código precisa de um ambiente de tempo de execução free-threaded.
- Seu aplicativo precisa criar ou destruir dinamicamente dicionários confiáveis ou filas ou serviços inteiros em tempo de execução.
- Você precisa controlar programaticamente os recursos de backup e restauração fornecidos pelo Service Fabric para o estado do serviço.
- Seu aplicativo precisa manter o histórico de alterações para suas unidades de estado.
- Você deseja desenvolver ou consumir provedores de estado personalizados desenvolvidos por terceiros.