5

起動時に特定のアクターを生成するようにシステムに要求する方法はありますか?

Program.cs現在、アクターの登録後に必要なアクターのセットをアクティブにしています。

これは問題なく動作していReminderLoadInProgressExceptionますが、アクティブ化されているアクターがリマインダーを登録する必要があるのに、それを実行しようとした時点ですべてのリマインダーが読み込まれているわけではないため、ときどきエラーが発生します。

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

4

2 に答える 2

8

いいえ、アクターをアクティブにするために何かが必要です。

お気づきかもしれませんが、Program.cs の実行はサービスのライフサイクルと実際には一致しないため、Program.cs は最適な場所ではありません。

アクター サービスの起動時にいくつかのアクターをアクティブ化する必要がある場合は、アクター サービスの RunAsync メソッドで行うのが適切です。ステートフル サービスを作成するときと同じように、アクター サービスから派生するサービスを作成することで、アクター サービスをカスタマイズできます。

編集:最初に 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/ を参照してください。

于 2016-04-19T22:55:54.570 に答える
6

コメントできないので、ここにコメントを入れます:

完全を期すために: 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)
...
于 2016-06-23T08:53:56.657 に答える