Partilhar via


Como atores confiáveis usam a plataforma Service Fabric

Este artigo explica como os Atores Confiáveis funcionam na plataforma Azure Service Fabric. Os Atores Fiáveis são executados numa estrutura hospedada numa implementação de um serviço fiável com estado persistente chamado serviço de ator. O serviço ator contém todos os componentes necessários para gerenciar o ciclo de vida e o envio de mensagens para seus atores:

  • O Ator Runtime gerencia o ciclo de vida, a coleta de lixo e impõe o acesso de thread único.
  • Um ouvinte remoto de serviço de ator aceita chamadas de acesso remoto para atores e as envia a um despachante para rotear para a instância de ator apropriada.
  • O Provedor de Estado do Ator encapsula os provedores de estado (como o provedor de estado de Coleções Confiáveis) e fornece um adaptador para o gerenciamento do estado do ator.

Esses componentes juntos formam a estrutura do Ator Confiável.

Camadas de serviço

Como o serviço de ator em si é um serviço confiável, todos os conceitos de modelo de aplicativo, ciclo de vida, empacotamento, implantação, atualização e dimensionamento dos Serviços Confiáveis se aplicam da mesma maneira aos serviços do ator.

Estruturação de camadas de serviço de ator

O diagrama anterior mostra a relação entre as estruturas de aplicativo do Service Fabric e o código do usuário. Os elementos azuis representam a estrutura do aplicativo Serviços Confiáveis, o laranja representa a estrutura do Ator Confiável e o verde representa o código do usuário.

Em Serviços Confiáveis, seu serviço herda a StatefulService classe. Esta classe é derivada de StatefulServiceBase (ou StatelessService para serviços sem estado). Em Reliable Actors, você usa o serviço de ator. O serviço de atores é uma implementação diferente da classe StatefulServiceBase que implementa o padrão de ator onde os seus atores são executados. Como o serviço de ator em si é apenas uma implementação de StatefulServiceBase, pode escrever o seu próprio serviço que deriva de ActorService e implementa recursos de nível de serviço da mesma forma que faria ao herdar de StatefulService, como:

  • Serviço de backup e restauração.
  • Funcionalidade compartilhada para todos os atores, por exemplo, um disjuntor.
  • O procedimento remoto chama o próprio serviço do ator e cada ator individualmente.

Para obter mais informações, consulte Implementando características de nível de serviço no seu serviço de ator.

Modelo de aplicação

Os serviços do ator são serviços confiáveis, portanto, o modelo de aplicativo é o mesmo. No entanto, as ferramentas de construção da estrutura de atores geram alguns dos ficheiros de modelo da aplicação para você.

Manifesto de serviço

As ferramentas de construção da estrutura de atores geram automaticamente o conteúdo do arquivo ServiceManifest.xml do serviço do ator. Este ficheiro inclui:

  • Tipo de serviço do ator. O nome do tipo é gerado com base no nome do projeto do ator. Com base no atributo de persistência do seu ator, o sinalizador HasPersistedState também é definido em conformidade.
  • Pacote de código.
  • Pacote de configuração.
  • Recursos e endpoints.

Manifesto de aplicação

As ferramentas de construção da estrutura do ator criam automaticamente uma definição de serviço padrão para o serviço do ator. As ferramentas de compilação preenchem as propriedades de serviço padrão:

  • A contagem de conjuntos de réplicas é determinada pelo atributo de persistência do ator. Sempre que o atributo de persistência no ator é alterado, a contagem do conjunto de réplicas na definição de serviço padrão é redefinida em conformidade.
  • O esquema de partição e o intervalo são definidos como Uniform Int64 com o intervalo de teclas Int64 completo.

Conceitos de partição do Service Fabric para atores

Os serviços de atores são serviços com estado particionado. Cada partição de um serviço de ator contém um conjunto de atores. As partições de serviço são distribuídas automaticamente por vários nós no Service Fabric. Como resultado, as instâncias de atores são distribuídas.

Particionamento e distribuição de atores

Serviços confiáveis podem ser criados com diferentes esquemas de partição e intervalos de chaves de partição. O serviço ator usa o esquema de particionamento Int64 com o intervalo de chaves Int64 completo para mapear atores para partições.

ID do ator

Cada ator criado no serviço tem um ID exclusivo associado a ele, representado pela ActorId classe. ActorId é um valor de ID opaco que pode ser usado para distribuição uniforme de atores nas partições de serviço gerando IDs aleatórios:

ActorProxy.Create<IMyActor>(ActorId.CreateRandom());
ActorProxyBase.create<MyActor>(MyActor.class, ActorId.newId());

Cada ActorId é convertido em um hash Int64. É por isso que o serviço ator deve usar um esquema de particionamento Int64 com o intervalo de teclas Int64 completo. No entanto, valores de ID personalizados podem ser usados para um ActorID, incluindo GUIDs/UUIDs, strings e Int64s.

ActorProxy.Create<IMyActor>(new ActorId(Guid.NewGuid()));
ActorProxy.Create<IMyActor>(new ActorId("myActorId"));
ActorProxy.Create<IMyActor>(new ActorId(1234));
ActorProxyBase.create(MyActor.class, new ActorId(UUID.randomUUID()));
ActorProxyBase.create(MyActor.class, new ActorId("myActorId"));
ActorProxyBase.create(MyActor.class, new ActorId(1234));

Quando estiveres a usar GUIDs/UUIDs e strings, os valores são convertidos em hash para um Int64. No entanto, quando você estiver fornecendo explicitamente um Int64 para um ActorId, o Int64 será mapeado diretamente para uma partição sem hash adicional. Você pode usar essa técnica para controlar em qual partição os atores são colocados.

Próximos passos