Functies op serviceniveau implementeren in uw actorservice
Zoals beschreven in servicelagen, is de actorservice zelf een betrouwbare service. U kunt uw eigen service schrijven die is afgeleid van ActorService
. U kunt functies op serviceniveau ook op dezelfde manier implementeren als wanneer u een stateful service over neemt, zoals:
- Back-up en herstel van de service.
- Gedeelde functionaliteit voor alle actoren, bijvoorbeeld een circuitonderbreker.
- Externe procedure roept de actorservice zelf en op elke afzonderlijke actor aan.
De actorservice gebruiken
Actorinstanties hebben toegang tot de actorservice waarin ze worden uitgevoerd. Via de actorservice kunnen actorinstanties programmatisch de servicecontext verkrijgen. De servicecontext bevat de partitie-id, servicenaam, toepassingsnaam en andere platformspecifieke informatie van Azure Service Fabric.
Task MyActorMethod()
{
Guid partitionId = this.ActorService.Context.PartitionId;
string serviceTypeName = this.ActorService.Context.ServiceTypeName;
Uri serviceInstanceName = this.ActorService.Context.ServiceName;
string applicationInstanceName = this.ActorService.Context.CodePackageActivationContext.ApplicationName;
}
CompletableFuture<?> MyActorMethod()
{
UUID partitionId = this.getActorService().getServiceContext().getPartitionId();
String serviceTypeName = this.getActorService().getServiceContext().getServiceTypeName();
URI serviceInstanceName = this.getActorService().getServiceContext().getServiceName();
String applicationInstanceName = this.getActorService().getServiceContext().getCodePackageActivationContext().getApplicationName();
}
Net als alle Reliable Services moet de actorservice worden geregistreerd bij een servicetype in de Service Fabric-runtime. De actorservice moet ook worden geregistreerd bij de actorservice om uw actorexemplaren uit te voeren. De ActorRuntime
-registratiemethode doet dit voor actors. In het eenvoudigste geval kunt u uw actortype registreren en de actorservice gebruikt vervolgens de standaardinstellingen.
static class Program
{
private static void Main()
{
ActorRuntime.RegisterActorAsync<MyActor>().GetAwaiter().GetResult();
Thread.Sleep(Timeout.Infinite);
}
}
U kunt ook een lambda van de registratiemethode gebruiken om de actorservice zelf samen te stellen. Vervolgens kunt u de actorservice configureren en expliciet uw actorinstanties samenstellen. U kunt afhankelijkheden aan uw actor injecteren via de constructor.
static class Program
{
private static void Main()
{
ActorRuntime.RegisterActorAsync<MyActor>(
(context, actorType) => new ActorService(context, actorType, () => new MyActor()))
.GetAwaiter().GetResult();
Thread.Sleep(Timeout.Infinite);
}
}
static class Program
{
private static void Main()
{
ActorRuntime.registerActorAsync(
MyActor.class,
(context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
timeout);
Thread.sleep(Long.MAX_VALUE);
}
}
Actor-servicemethoden
De actorservice implementeert IActorService
(C#) of ActorService
(Java), die op zijn beurt (C#) of Service
(Java) implementeert IService
. Deze interface wordt gebruikt door externe communicatie van Reliable Services, waardoor externe procedure-aanroepen van servicemethoden mogelijk zijn. Het bevat methoden op serviceniveau die extern kunnen worden aangeroepen via externe communicatie van services. U kunt het gebruiken om actoren op te sommen en te verwijderen .
Aangepaste actorservice
Met behulp van de lambda voor actorregistratie kunt u uw eigen aangepaste actorservice registreren die is afgeleid van ActorService
(C#) en FabricActorService
(Java). Vervolgens kunt u uw eigen functionaliteit op serviceniveau implementeren door een serviceklasse te schrijven die (C#) of FabricActorService
(Java) over neemt ActorService
. Een aangepaste actorservice neemt alle runtime-functionaliteit van de actor over van ActorService
(C#) of FabricActorService
(Java). Het kan worden gebruikt om uw eigen servicemethoden te implementeren.
class MyActorService : ActorService
{
public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, Func<ActorBase> newActor)
: base(context, typeInfo, newActor)
{ }
}
class MyActorService extends FabricActorService
{
public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, BiFunction<FabricActorService, ActorId, ActorBase> newActor)
{
super(context, typeInfo, newActor);
}
}
static class Program
{
private static void Main()
{
ActorRuntime.RegisterActorAsync<MyActor>(
(context, actorType) => new MyActorService(context, actorType, () => new MyActor()))
.GetAwaiter().GetResult();
Thread.Sleep(Timeout.Infinite);
}
}
public class Program
{
public static void main(String[] args)
{
ActorRuntime.registerActorAsync(
MyActor.class,
(context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
timeout);
Thread.sleep(Long.MAX_VALUE);
}
}
Actorback-up en herstel implementeren
Een aangepaste actorservice kan een methode beschikbaar stellen om een back-up te maken van actorgegevens door gebruik te maken van de externe listener die al aanwezig is.ActorService
Zie Back-up- en herstelactoren voor een voorbeeld.
Actor die gebruikmaakt van een externe V2-stack (interface-compatibel)
De externe V2-stack (interface compatibel, ook wel V2_1 genoemd) heeft alle functies van de externe V2-stack. De interface is compatibel met de externe V1-stack, maar is niet achterwaarts compatibel met V2 en V1. Als u een upgrade wilt uitvoeren van V1 naar V2_1 zonder gevolgen voor de beschikbaarheid van de service, volgt u de stappen in de volgende sectie.
De volgende wijzigingen zijn vereist voor het gebruik van de externe V2_1 stack:
Voeg het volgende assemblykenmerk toe aan actorinterfaces.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Build and upgrade actor service and actor client projects to start using the V2 stack.
Upgrade van actorservice naar externe V2-stack (interface-compatibel) zonder dat dit van invloed is op de beschikbaarheid van de service
Deze wijziging is een upgrade in twee stappen. Volg de stappen in deze volgorde.
Voeg het volgende assemblykenmerk toe aan actorinterfaces. Dit kenmerk start twee listeners voor de actorservice, V1 (bestaand) en de V2_1-listener. Werk de actorservice bij met deze wijziging.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Werk de actorclients bij nadat u de vorige upgrade hebt voltooid. Deze stap zorgt ervoor dat de actorproxy gebruikmaakt van de externe V2_1 stack.
Deze stap is optioneel. Wijzig het vorige kenmerk om de V1-listener te verwijderen.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Actor die gebruikmaakt van de externe V2-stack
Met het NuGet-pakket versie 2.8 kunnen gebruikers nu de externe V2-stack gebruiken, die beter presteert en functies biedt zoals aangepaste serialisatie. Externe communicatie V2 is niet achterwaarts compatibel met de bestaande externe stack (nu de V1 externe stack genoemd).
De volgende wijzigingen zijn vereist voor het gebruik van de externe V2-stack.
Voeg het volgende assemblykenmerk toe aan actorinterfaces.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
Bouw en upgrade de actorservice- en actorclientprojecten om de V2-stack te gaan gebruiken.
Upgrade de actorservice naar de externe V2-stack zonder dat dit van invloed is op de beschikbaarheid van de service
Deze wijziging is een upgrade in twee stappen. Volg de stappen in deze volgorde.
Voeg het volgende assemblykenmerk toe aan actorinterfaces. Dit kenmerk start twee listeners voor de actorservice, V1 (bestaand) en de V2-listener. Werk de actorservice bij met deze wijziging.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
Werk de actorclients bij nadat u de vorige upgrade hebt voltooid. Deze stap zorgt ervoor dat de actorproxy gebruikmaakt van de externe V2-stack.
Deze stap is optioneel. Wijzig het vorige kenmerk om de V1-listener te verwijderen.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]