Så använder Reliable Actors Service Fabric-plattformen
Den här artikeln förklarar hur Reliable Actors fungerar på Azure Service Fabric-plattformen. Reliable Actors körs i ett ramverk som finns i en implementering av en tillståndskänslig tillförlitlig tjänst som kallas aktörstjänsten. Aktörstjänsten innehåller alla komponenter som krävs för att hantera livscykeln och meddelandesändningen för dina aktörer:
- Actor Runtime hanterar livscykel, skräpinsamling och framtvingar enkeltrådad åtkomst.
- En lyssnare för aktörstjänstens fjärrkommunikation accepterar fjärråtkomstanrop till aktörer och skickar dem till en dispatcher för att dirigera till lämplig aktörsinstans.
- Aktörstillståndsprovidern omsluter tillståndsprovidrar (till exempel tillståndsprovidern för tillförlitliga samlingar) och tillhandahåller ett kort för hantering av aktörstillstånd.
Dessa komponenter utgör tillsammans ramverket Reliable Actor.
Tjänstskiktning
Eftersom aktörstjänsten i sig är en tillförlitlig tjänst gäller alla programmodeller, livscykel, paketering, distribution, uppgradering och skalning av Reliable Services på samma sätt för aktörstjänster.
Föregående diagram visar relationen mellan Service Fabric-programramverk och användarkod. Blå element representerar reliable services-programramverket, orange representerar ramverket Reliable Actor och grönt representerar användarkod.
I Reliable Services ärver StatefulService
din tjänst klassen. Den här klassen härleds själv från StatefulServiceBase
(eller StatelessService
för tillståndslösa tjänster). I Reliable Actors använder du aktörstjänsten. Aktörstjänsten är en annan implementering av StatefulServiceBase
klassen som implementerar aktörsmönstret där dina aktörer körs. Eftersom aktörstjänsten i sig bara är en implementering av StatefulServiceBase
kan du skriva en egen tjänst som härleds från ActorService
och implementera funktioner på tjänstnivå på samma sätt som när du ärver StatefulService
, till exempel:
- Tjänstsäkerhetskopiering och återställning.
- Delade funktioner för alla aktörer, till exempel en kretsbrytare.
- Fjärrproceduren anropar själva aktörstjänsten och på varje enskild aktör.
Mer information finns i Implementera funktioner på tjänstnivå i aktörstjänsten.
Programmodell
Aktörstjänster är Reliable Services, så programmodellen är densamma. Utvecklarverktygen för aktörsramverket genererar dock några av programmodellfilerna åt dig.
Tjänstmanifest
Aktörsramverkets byggverktyg genererar automatiskt innehållet i aktörstjänstens ServiceManifest.xml-fil. Den här filen innehåller:
- Aktörstjänsttyp. Typnamnet genereras baserat på aktörens projektnamn. Baserat på persistence-attributet för din aktör anges också HasPersistedState-flaggan i enlighet med detta.
- Kodpaket.
- Konfigurationspaket.
- Resurser och slutpunkter.
Programmanifest
Utvecklarverktygen för aktörsramverket skapar automatiskt en standardtjänstdefinition för aktörstjänsten. Byggverktygen fyller i standardtjänstegenskaperna:
- Antal replikeringsuppsättningar bestäms av persistence-attributet för din aktör. Varje gång beständighetsattributet för aktören ändras återställs antalet replikuppsättningar i standardtjänstdefinitionen i enlighet med detta.
- Partitionsschema och intervall är inställda på Uniform Int64 med det fullständiga Int64-nyckelintervallet.
Service Fabric-partitionsbegrepp för aktörer
Aktörstjänster är partitionerade tillståndskänsliga tjänster. Varje partition av en aktörstjänst innehåller en uppsättning aktörer. Tjänstpartitioner distribueras automatiskt över flera noder i Service Fabric. Aktörsinstanser distribueras därför.
Reliable Services kan skapas med olika partitionsscheman och partitionsnyckelintervall. Aktörstjänsten använder Int64-partitioneringsschemat med hela Int64-nyckelintervallet för att mappa aktörer till partitioner.
Aktörs-ID
Varje aktör som skapas i tjänsten har ett unikt ID som är associerat med det, representerat av ActorId
klassen. ActorId
är ett täckande ID-värde som kan användas för enhetlig distribution av aktörer över tjänstpartitionerna genom att generera slumpmässiga ID:t:
ActorProxy.Create<IMyActor>(ActorId.CreateRandom());
ActorProxyBase.create<MyActor>(MyActor.class, ActorId.newId());
Varje ActorId
hashas till en Int64. Det är därför aktörstjänsten måste använda ett Int64-partitioneringsschema med hela Int64-nyckelintervallet. Anpassade ID-värden kan dock användas för , ActorID
inklusive GUID/UUID, strängar och 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));
När du använder GUID:er/UUID:er och strängar hashas värdena till en Int64. Men när du uttryckligen tillhandahåller en Int64 till en ActorId
mappas Int64 direkt till en partition utan ytterligare hashning. Du kan använda den här tekniken för att styra vilken partition som aktörerna placeras i.