2016-04-19 13 views
4

起動時に特定のアクターを起動するようにシステムに要求する方法はありますか?サービスファブリックは起動時にアクターを起動します

現在、私は俳優の登録後にProgram.csに必要な俳優のセットを有効にしています。

これは正常ですが、アクティブになっている俳優がリマインダーを登録する必要があるため、すべてのリマインダーがロードされていないため、時々ReminderLoadInProgressExceptionが表示されることがあります。

クラスタをシードする標準的な方法はありますか?

+0

リマインダでこれを行うことはできませんか?私は最近俳優を見ていない。 –

答えて

7

いいえ、あなたはあなたの俳優をアクティブにする必要があります。

Program.csはおそらく気付いたように、実行がサービスのライフサイクルと実際に整列していないため、実行するのに最適な場所ではありません。

アクターサービスの起動時にいくつかのアクターをアクティブにする必要がある場合は、そのアクターサービスのRunAsyncメソッドを使用するとよいでしょう。ステートフルサービスを作成するときと同じように、俳優サービスをカスタマイズすることができます。

EDIT:まずbase.RunAsync()を呼び出して待ってください!

その後、
class MyActorService : ActorService 
{ 
    public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, Func<ActorBase> newActor) 
     : base(context, typeInfo, newActor) 
    { } 

    protected async override Task RunAsync(CancellationToken cancellationToken) 
    { 
     await base.RunAsync(cancellationToken); 

     var proxy = ActorProxy.Create<IMyActor>(new ActorId(0)); 
     await proxy.StartDoingStuff(); 
    } 
} 

そしてランタイムがあなたの俳優のインスタンスをホストするためにそれを使用するために知っているので、あなたの俳優のサービスを登録します。

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

     Thread.Sleep(Timeout.Infinite); 
    } 
} 

このたび、主に実行されるためだけで、俳優の方法は冪等であることを確認してくださいアクターサービスのレプリカが起動されます(フェイルオーバー、リソースバランシング、アプリケーションのアップグレードなどの後)。ただし、アクターサービスが準備される前に実行され、サービスが起動すると常に実行されます。

俳優サービスと連携する方法についての詳細はこちらをご覧ください:完全を期すために

https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-actors-platform/

+0

私たちはこのソリューションを使って約1500人のActorインスタンスを(今のところは)起動しています。まだテスト段階にあるため、アクターは何もしていません。しかし、5ノードクラスタ(A1マシン)では、すべてのノードが非常に大量のCPUを消費しています(ほとんど100%使用時)。それは普通だと思いますか?実際に何かをしている20Kのインスタンスを生成するために、このテクニックを使用する予定です(今のところ待っているのではなく、実際の作業を意味します)。あなたはそれを行う "良い方法"についてアドバイスできますか? –

3

ので、私はここにコメントを入れているコメントすることはできませんあなたのActorServiceサブクラスがない場合(ServiceManifest.xmlから - たとえば、あなたが動的にサービスインスタンスを生成する)デフォルトの名前を持って、あなたはこのような2つのパラメータをActorProxy.Createのオーバーロードを使用する必要があります。そうしないとあなたが得るでしょう

var actor = ActorProxy.Create<IMyActor>(new ActorId(0), this.Context.ServiceName); 

を"サービスは存在しません"例外:

System.Fabric.FabricServiceNotFoundException: Service does not exist. 
---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80071BCD at 
System.Fabric.Interop.NativeClient.IFabricServiceManagementClient4 
.EndResolveServicePartition(IFabricAsyncOperationContext context) 
... 
+0

これもコメントのためには長すぎるでしょう:-)あなたの貢献に感謝します! –

関連する問題