Partilhar via


Como os Reliable Actors utilizam a plataforma Service Fabric

Este artigo explica como os Atores Confiáveis funcionam na plataforma Azure Service Fabric. Os Atores Confiáveis são executados em uma estrutura hospedada em uma implementação de um serviço confiável com monitoração de estado 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.

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 ator é uma implementação diferente da classe que implementa StatefulServiceBase o padrão de ator onde seus atores são executados. Como o serviço de ator em si é apenas uma implementação do , você pode escrever seu próprio serviço que deriva e implementa recursos de nível de StatefulServiceBaseActorService serviço da mesma forma que faria ao herdar 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 recursos de nível de serviço em 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 do ator geram alguns dos arquivos de modelo de aplicativo para você.

Manifesto de serviço

As ferramentas de construção da estrutura do ator geram automaticamente o conteúdo do arquivo de 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 em seu ator, o sinalizador HasPersistedState também é definido de acordo.
  • 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 no 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 de acordo.
  • 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 ator são serviços com estado particionados. 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 é um hash para um 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 utiliza GUIDs/UUIDs e cadeias, é criado um hash dos valores num Int64. No entanto, quando indica explicitamente um Int64 a um ActorId, o Int64 mapeará diretamente para uma partição sem hashing adicional. Você pode usar essa técnica para controlar em qual partição os atores são colocados.

Próximos passos