2016-05-10 5 views
9

Ich habe here gelesen, das sollte möglich sein, eng gekoppelte ActorTypes innerhalb des gleichen Dienstes zu hosten, aber ich kann nicht scheinen, irgendeine Dokumentation genau zu finden, wie man es tut.Wie kann ich mehrere Service Fabric Actor-Typen in einem einzelnen Service hosten?

Ich dachte, dass ich meine eigene Instanz des ActorService erstellen und den Kontext übergeben muss, aber ich habe nicht gesehen, die richtigen APIs aus dem Dokument zu finden.

Hat jemand ein Beispiel, das sie teilen könnten?

Antwort

16

Art von aber nicht wirklich. Sie können mehrere Akteurentypen in derselben Anwendung haben. Offenbar befinden sie sich in Visual Studio in demselben Dienst, sie werden jedoch tatsächlich als separate Dienste bereitgestellt. Bär mit mir für eine Minute, wenn man so will ..

So können Sie mehrere Schauspieler wie dieses Register:

internal static class Program 
{ 
    private static void Main() 
    { 
     ActorRuntime.RegisterActorAsync<Actor1>().GetAwaiter().GetResult(); 
     ActorRuntime.RegisterActorAsync<Actor2>().GetAwaiter().GetResult(); 

     Thread.Sleep(Timeout.Infinite); 
    } 
} 

Große, habe ich mehrere Schauspieler-Typen. Das funktioniert und du kannst das einfach tun.

Aber Sie wollen wissen wie es funktioniert! Nun, das ist nur eine vereinfachte Version davon:

internal static class Program 
{ 
    private static void Main() 
    { 
     ActorRuntime.RegisterActorAsync<Actor1>(
      (context, actorType) => new ActorService(context, actorType,() => new Actor1())).GetAwaiter().GetResult(); 

     ActorRuntime.RegisterActorAsync<Actor2>(
      (context, actorType) => new ActorService(context, actorType,() => new Actor2())).GetAwaiter().GetResult(); 

     Thread.Sleep(Timeout.Infinite); 
    } 
} 

Dies ist mehr zu sagen, was tatsächlich geschieht, weil man hier sehen, ich habe jetzt zwei Dienste. So was ist los?

Das Geheimnis ist in der ActorRuntime. Es macht ein wenig mehr Arbeit als ServiceRuntime (wo Sie Reliable Services normalerweise registrieren). Der Actor-Framework-Buildprozess zaubert in Ihrem Namen, um einen Servicetyp und eine Standardserviceinstanz in Ihrer Anwendung zu konfigurieren für jeden Actor-Typ. Sie können dies in Ihrem ApplicationManifest.xml sehen, wo die Build-Tools für Sie Standarddienste einrichtet:

<DefaultServices> 
    <Service Name="Actor1ActorService" GeneratedIdRef="3262c188-3eee-44c5-9d1e-d2c2a2685f89|Persisted"> 
    <StatefulService ServiceTypeName="Actor1ActorServiceType" TargetReplicaSetSize="[Actor1ActorService_TargetReplicaSetSize]" MinReplicaSetSize="[Actor1ActorService_MinReplicaSetSize]"> 
     <UniformInt64Partition PartitionCount="[Actor1ActorService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" /> 
    </StatefulService> 
    </Service> 
    <Service Name="Actor2ActorService" GeneratedIdRef="1bc66d2c-0479-4bb2-a9aa-3254030506f1|Persisted"> 
    <StatefulService ServiceTypeName="Actor2ActorServiceType" TargetReplicaSetSize="[Actor2ActorService_TargetReplicaSetSize]" MinReplicaSetSize="[Actor2ActorService_MinReplicaSetSize]"> 
     <UniformInt64Partition PartitionCount="[Actor2ActorService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" /> 
    </StatefulService> 
    </Service> 

Als Beispiel, wenn ich die beiden Schauspieler Typen nehme ich oben definiert haben und einsetzen, dass Anwendung, hier ist das Ergebnis:

actor services

Diese tatsächlich getrennte Service-Instanzen in der Anwendung sind, und jeweils von einem anderen Service-Typ, von denen alle für dich automatisch generiert wird:

enter image description here

Und natürlich, weil sie unterschiedliche Service-Instanzen sind, werden sie über den Cluster sein verteilen, wie Sie normalerweise erwarten würde:

enter image description here

Ich werde Update gehen, dass Dok.

+0

Wir hatten also gehofft zu erreichen, indem sie in demselben Dienst ausgeführt wurde, um den Leistungsaufwand von Actor1 und Actor2 zu minimieren, die miteinander kommunizieren; insbesondere wenn sie wie in Ihrem Beispiel auf verschiedenen Knoten gehostet werden.Was können wir noch tun, um den Aufwand für die Kommunikation zwischen den Akteuren zu minimieren? –

+1

Nun, die Replikate der Servicepartitionen sind auf Knoten verteilt, aber Sie können steuern, auf welche Partition Ihre Akteure zugreifen, indem Sie die Actor IDs bearbeiten (siehe hier: https: // azure .microsoft.com/de-de/documentation/articles/service-fabric-reliable-aktor-plattform/# service-fabric-partition-concepts-for-aktors). Sie können zwar den Netzwerkverkehr eliminieren, überschreiten aber immer noch die Prozessgrenzen, so dass Sie immer noch Serialisierungskosten haben. –

+0

Cool, das war, was wir dachten, also wenn wir die Objekte klein bis winzig halten, dann ist das so gut wie es geht. Wir sollten darüber nachdenken, wenn wir entscheiden, was ein Schauspieler ist und was eine Bibliothek ist, denke ich. –

Verwandte Themen