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.
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 StatefulServiceBase
ActorService
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.
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.