2016-05-10 17 views
9

私はhereを読んだことがあります。これは、同じサービス内で密接に結合されたActorTypesをホストすることができるはずですが、どうやってそれを行うのか正確にはわかりません。1つのサービス内で複数のサービスファブリックアクタータイプをホストするにはどうすればよいですか?

ActorServiceの独自のインスタンスを作成してコンテキストを渡す必要があるかもしれないと思っていましたが、ドキュメントから正しいAPIを見つけることができませんでした。

共有できる例はありますか?

答えて

16

並べ替えられていますが、実際はありません。同じアプリケーションに複数のアクタータイプを含めることができます。 Visual Studioでは同じサービスを利用しているように見えますが、実際は別々のサービスとして展開されています。

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

     Thread.Sleep(Timeout.Infinite); 
    } 
} 

グレート、私は複数の役者の種類があります。ですから、このような複数のアクターを登録することができます

あなたは...するかどう分間私と一緒にクマ。これは機能し、あなたはそれを行うことができます。

しかし、あなたが知ってほしいどのようにそれは動作します!あなたはここを参照してください、私は今、2つのサービスを持っているので、

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); 
    } 
} 

これは実際に何が起こっているかのより多くの占いです:まあ、それはこれのちょうど簡易版です。どうしたの?

秘密はActorRuntimeにあります。 ServiceRuntime(信頼できるサービスを通常登録する場所)よりももう少し時間がかかります。 Actorフレームワークのビルドプロセスは、あなたの代わりに、各アクタータイプのに対して、アプリケーション内のサービスタイプとデフォルトのサービスインスタンスを構成するための魔法を実行します。

<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> 

例として、私は私が上で定義された2つの俳優の種類を取るとことを展開する場合:あなたは、ビルドツールがあなたのために、デフォルトのサービスを設定し、あなたのApplicationManifest.xml、でこれを見ることができますアプリケーションは、ここでの結果である:これらは、実際のアプリケーションで個別のサービスインスタンスである

actor services

、それぞれがすべてが自動的に生成され、異なるサービスタイプのものである:

enter image description here

そして、彼らは異なるサービスインスタンスだから当然のことながら、彼らはあなたが正常に期待するとして、クラスタ全体に配布されます:

enter image description here

私は更新することを行きますよdoc。

+0

私たちはActor1とActor2が互いに通信する際のパフォーマンスオーバーヘッドを最小限に抑えるために、同じサービスでそれらを実行することで実現したいと考えていました。あなたの例のように異なるノードにホストされている場合は特にそうです。アクター間通信のオーバーヘッドを最小限に抑えるために他に何ができるのですか –

+1

サービスパーティションのレプリカはノード間で分散されますが、アクターIDを操作することで、アクターが入るパーティションを制御できます(https:// azureマイクロソフトのWebサイトを参照してください。http://www.microsoft.com/japan/windowsserver2003/default.mspxを参照してください。ネットワークトラフィックは排除できますが、それでもプロセスの境界を越えているため、引き続きシリアル化コストが発生します。 –

+0

これは私たちが考えていたものです。オブジェクトを小さくしておけば、それは得られるほど良くなります。私たちはまた、何が俳優であり、私が推測するライブラリが何であるかを決めるときにこれを考慮する必要があります。 –

関連する問題