Delen via


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 draaien. 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. Opdat de actorservice uw actorexemplaren kan uitvoeren, moet uw actortype ook bij de actorservice zijn geregistreerd. De ActorRuntime registratiemethode voert dit werk uit voor actoren. 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 op te zetten. 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);
    }
}

Methoden van acteursdiensten

De actorservice implementeert IActorService (C#) of ActorService (Java), wat op zijn beurt IService (C#) of Service (Java) implementeert. Deze interface wordt gebruikt door Reliable Services-remoting, waarmee externe procedure-aanroepen op servicemethoden mogelijk zijn. Het bevat serviceniveaumethoden die op afstand kunnen worden aangeroepen via service remoting. U kunt het gebruiken om actoren op te sommen en te verwijderen .

Aangepaste actor-service

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 ActorService (C#) of FabricActorService (Java) erft. 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);
    }
}

Back-up en herstel van acteurs implementeren

Een aangepaste actorservice kan een methode beschikbaar stellen om een back-up te maken van actorgegevens door gebruik te maken van de remoting listener die al aanwezig is in ActorService. Zie Back-up- en herstelactoren voor een voorbeeld.

Actor die gebruikmaakt van een externe V2-stack (interface-compatibel)

De remoting V2 (interface-compatibel en bekend als V2_1) stack heeft alle functies van de remoting V2 stack. De interface is compatibel met de remoting V1-stack, maar is niet compatibel met oudere versies 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 remoting V2_1 stack:

  1. Voeg het volgende assemblykenmerk toe aan actorinterfaces.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    
  2. Bouw en upgrade acteursdienst- en acteursclientprojecten om de V2-stack te gaan gebruiken.

Upgrade van de actor service naar de remoting V2-stack (interface-compatibel) zonder de beschikbaarheid van de service te beïnvloeden.

Deze wijziging is een upgrade in twee stappen. Volg de stappen in deze volgorde.

  1. Voeg het volgende assemblykenmerk toe aan actorinterfaces. Dit kenmerk start twee listeners voor de actorservice, V1 (bestaand) en de V2_1-listener. Werk de actor-service bij met deze wijziging.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    
  2. Werk de actorclients bij nadat u de vorige upgrade hebt voltooid. Deze stap zorgt ervoor dat de actorproxy de remoting V2_1 stack gebruikt.

  3. 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. Remoting V2 is niet backward compatibel met de bestaande remoting stack (nu de V1 remoting stack genoemd).

De volgende wijzigingen zijn vereist voor het gebruik van de remoting V2-stack.

  1. Voeg het volgende assemblykenmerk toe aan actorinterfaces.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    
  2. 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.

  1. 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)]
    
  2. Werk de actorclients bij nadat u de vorige upgrade hebt voltooid. Deze stap zorgt ervoor dat de actorproxy gebruikmaakt van de externe V2-stack.

  3. Deze stap is optioneel. Wijzig het vorige kenmerk om de V1-listener te verwijderen.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    

Volgende stappen