[英]Service Fabric spawn actor on startup
有沒有辦法要求系統在啟動時產生某些actor。
目前我在演員注冊后激活了Program.cs
中我需要的演員集。
這工作正常,但我偶爾會得到一個ReminderLoadInProgressException
因為正在激活的actor需要注冊一個提醒,但並非所有提醒都在它嘗試這樣做時被加載。
是否有種子集群的標准方法?
不,你需要一些東西來激活你的演員。
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服務的主副本時執行(在故障轉移,資源平衡,應用程序升級等之后),但是好處是它不會在你執行之前執行actor服務已准備就緒,它將始終在服務啟動時執行。
有關如何使用actor服務的更多信息,請參閱此處: https : //azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-actors-platform/
無法評論所以我在這里發表評論:
為了完整起見:如果您的ActorService子類沒有默認名稱(來自ServiceManifest.xml - 例如您動態生成服務實例),則必須使用雙參數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)
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.