Service Fabric在启动时生成actor

时间:2016-04-19 21:22:28

标签: c# azure-service-fabric service-fabric-actor

有没有办法要求系统在启动时产生某些演员。

目前我在演员注册后激活Program.cs中需要的演员集。

这项工作正常,但我偶尔会得到一个ReminderLoadInProgressException,因为正在激活的演员需要注册一个提醒,但并非所有提醒都是在尝试这样做时加载的。

是否有种子集群的标准方式?

2 个答案:

答案 0 :(得分:7)

不,你需要一些东西来激活你的演员。

Program.cs并不是最好的选择,因为它的执行并不能与您服务的生命周期紧密相关,因为您可能已经注意到了。

如果你需要在你的actor服务启动时激活一些actor,那么一个好的地方就是你的actor服务的RunAsync方法。您可以通过编写从中派生的服务来自定义您的actor服务,就像编写有状态服务时一样:

编辑:确保先调用并等待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();
    }
}

然后注册您的actor服务,以便运行时知道使用它来托管您的actor实例:

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

        Thread.Sleep(Timeout.Infinite);
    }
}

确保actor方法是幂等的,因为这将在每次启动actor服务的主副本时执行(在故障转移,资源平衡,应用程序升级等之后),但好消息是它赢了&#39 ; t在您的actor服务准备就绪之前执行,并且它将始终在服务启动时执行。

有关如何使用演员服务的更多信息,请参阅此处:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-actors-platform/

答案 1 :(得分:4)

无法发表评论,所以我在这里发表评论:

为了完整起见:如果您的ActorService子类没有默认名称(来自ServiceManifest.xml - 例如您动态生成服务实例),则必须使用这样的双参数ActorProxy.Create重载:

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

否则你会得到&#34;服务不存在&#34;例外:

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