Implementieren von Features auf Dienstebene in Ihrem Akteurdienst
Wie in Dienstebenen beschrieben, ist der Actordienst selbst ein zuverlässiger Dienst. Sie können einen eigenen Dienst schreiben, der von ActorService
abgeleitet ist. Sie können auch Features auf Dienstebene genauso implementieren wie beim Vererben eines zustandsbehafteten Diensts, z.B.:
- Dienstsicherung und -wiederherstellung
- Gemeinsame Verwendung von Funktionen für alle Akteure, z. B. ein Schaltkreisunterbrecher
- Remoteprozeduraufrufe für den Akteurdienst selbst sowie für einzelne Akteure
Verwenden des Akteurdiensts
Akteurinstanzen haben Zugriff auf den Akteurdienst, in dem sie ausgeführt werden. Über den Akteurdienst können Akteurinstanzen den Dienstkontext programmgesteuert abrufen. Der Dienstkontext enthält die Partitions-ID, den Dienstnamen, den Anwendungsnamen und andere spezifische Informationen für die Azure Service Fabric-Plattform.
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();
}
Wie alle Reliable Services muss der Akteurdienst mit einem Diensttyp in der Service Fabric-Laufzeit registriert werden. Damit der Akteurdienst Ihre Akteurinstanzen ausführen kann, muss auch Ihr Akteurtyp beim Akteurdienst registriert werden. Die ActorRuntime
-Registrierungsmethode führt dies für Actors aus. Im einfachsten Fall müssen Sie nur den Akteurtyp registrieren, und der Akteurdienst verwendet dann die Standardeinstellungen.
static class Program
{
private static void Main()
{
ActorRuntime.RegisterActorAsync<MyActor>().GetAwaiter().GetResult();
Thread.Sleep(Timeout.Infinite);
}
}
Sie können auch ein Lambda verwenden, das von der Registrierungsmethode bereitgestellt wird, um selbst den Akteurdienst zu erstellen. Anschließend können Sie den Akteurdienst konfigurieren und Akteurinstanzen explizit erstellen. Sie können dann Abhängigkeiten über den Konstruktor in den Akteur einführen.
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);
}
}
Akteurdienstmethoden
Der Akteurdienst implementiert IActorService
(C#) oder ActorService
(Java), mit denen wiederum IService
(C#) bzw. Service
(Java) implementiert wird. Diese Schnittstelle wird für das Reliable Services-Remoting verwendet, das Remoteprozeduraufrufe von Dienstmethoden erlaubt. Sie enthält Methoden auf Dienstebene, die mit dem Dienstremoting aufgerufen werden können. Verwenden Sie sie zum Aufzählen und Löschen von Akteuren.
Benutzerdefinierter Akteurdienst
Mit dem Lambda für die Akteurregistrierung können Sie einen eigenen benutzerdefinierten Akteurdienst registrieren, der von ActorService
(C#) und FabricActorService
(Java) abgeleitet wird. Sie können dann eigene Funktionen auf Dienstebene implementieren, indem Sie eine Dienstklasse erstellen, die ActorService
(C#) oder FabricActorService
(Java) erbt. Ein benutzerdefinierter Akteurdienst erbt die gesamte Laufzeitfunktionalität des Akteurs von ActorService
(C#) bzw. FabricActorService
(Java). Er kann zum Implementieren eigener Dienstmethoden verwendet werden.
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);
}
}
Implementieren der Sicherung und Wiederherstellung von Akteuren
Der benutzerdefinierte Actordienst kann eine Methode zum Sichern von Actordaten bereitstellen. Diese nutzt die Vorteile des Remoting-Listeners, der bereits im ActorService
enthalten ist. Ein Beispiel finden Sie unter Implementieren von Sicherung und Wiederherstellung von Actors.
Akteur, der einen Remoting V2-Stapel (schnittstellenkompatibel) verwendet
Der Remoting V2-Stapel (schnittstellenkompatibel, auch als „V2_1“ bezeichnet) verfügt über alle Features des Remoting V2-Stapels. Die Schnittstelle ist mit dem Remoting V1-Stapel kompatibel, jedoch nicht abwärtskompatibel mit V2 und V1. Um ohne Auswirkungen auf die Dienstverfügbarkeit von V1 auf V2_1 zu aktualisieren, führen Sie die Schritte im nächsten Abschnitt aus.
Folgende Änderungen sind erforderlich, um den Remoting V2_1-Stapel verwenden zu können:
Fügen Sie Akteurschnittstellen das folgende assembly-Attribut hinzu.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Erstellen und aktualisieren Sie den Akteurdienst und Akteurclientprojekte, sodass in ihnen nun der V2-Stapel verwendet wird.
Upgrade für den Akteurddienst auf den Remoting V2-Stapel (schnittstellenkompatibel) ohne Beeinträchtigung der Dienstverfügbarkeit
Für diese Änderung wird ein Upgrade in zwei Schritten ausgeführt. Führen Sie die Schritte in dieser Reihenfolge aus.
Fügen Sie Akteurschnittstellen das folgende assembly-Attribut hinzu. Mit diesem Attribut werden zwei Listener für den Akteurdienst gestartet, V1 (vorhanden) und der V2_1-Listener. Aktualisieren Sie den Akteurdienst mit dieser Änderung.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Aktualisieren Sie die Akteurclients, nachdem Sie das vorherige Upgrade abgeschlossen haben. Mit diesem Schritt wird sichergestellt, dass der Akteurproxy den Remoting V2_1-Stapel verwendet.
Dieser Schritt ist optional. Ändern Sie das zuvor genannte Attribut, um den V1-Listener zu entfernen.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Akteur, der den Remoting V2-Stapel verwendet
Ab Version 2.8 des NuGet-Pakets können Benutzer den Remoting V2-Stapel verwenden, der leistungsfähiger ist und Features wie benutzerdefinierte Serialisierung bietet. Remoting V2 ist nicht abwärtskompatibel mit dem vorhandenen Remotingstapel (dieser wird jetzt als V1-Remotingstapel bezeichnet).
Die folgenden Änderungen sind erforderlich, um den Remoting V2-Stapel verwenden zu können.
Fügen Sie Akteurschnittstellen das folgende assembly-Attribut hinzu.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
Erstellen und aktualisieren Sie den Akteurdienst und Akteurclientprojekte, sodass in ihnen nun der V2-Stapel verwendet wird.
Upgrade des Akteurdiensts auf den Remoting V2-Stapel, ohne dass die Dienstverfügbarkeit beeinträchtigt wird
Für diese Änderung wird ein Upgrade in zwei Schritten ausgeführt. Führen Sie die Schritte in dieser Reihenfolge aus.
Fügen Sie Akteurschnittstellen das folgende assembly-Attribut hinzu. Mit diesem Attribut werden zwei Listener für den Akteurdienst gestartet, V1 (vorhanden) und der V2-Listener. Aktualisieren Sie den Akteurdienst mit dieser Änderung.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
Aktualisieren Sie die Akteurclients, nachdem Sie das vorherige Upgrade abgeschlossen haben. Mit diesem Schritt wird sichergestellt, dass der Akteurproxy den Remoting V2-Stapel verwendet.
Dieser Schritt ist optional. Ändern Sie das zuvor genannte Attribut, um den V1-Listener zu entfernen.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]