不能在服务结构的一个ActorRuntime中注册两个actor

本文关键字:注册 两个 actor ActorRuntime 一个 服务 不能 结构 | 更新日期: 2023-09-27 18:14:07

我有一个Service Fabric Actor Service。这将创建两个项目,ActorServiceActorService.Interfaces

ActorService。接口包含根参与者的接口,称为IRootActor。ActorService本身包含RootActorIChildActorChildActor。两个接口都实现了IActor,两个类都继承了Actor并实现了它们各自的接口。我像这样在Program.cs中注册这些actor:

ActorRuntime.RegisterActorAsync<ChildActor>(
   (context, actorType) => new ActorService(context, actorType, () => container.Resolve<ChildActor>()))
   .GetAwaiter()
   .GetResult();
ActorRuntime.RegisterActorAsync<RootActor>(
   (context, actorType) => new ActorService(context, actorType, () => container.Resolve<RootActor.Factory>()(context)))
   .GetAwaiter()
   .GetResult();
Thread.Sleep(Timeout.Infinite);

调用container.Resolve<RootActor.Factory>()(context)返回RootActor实例。

当我呼叫

IRootActory proxy = ActorProxy.Create<IRootActor>(new ActorId(id), actorServiceUri);
proxy.Method(data);

一切顺利。前面提到的RootActor.Method方法在一个循环中做两件事,创建子actor并调用它的方法:

IChildActor proxy = ActorProxy.Create<IChildActor>(new ActorId(otherId), sameActorServiceUri);
proxy.OtherMethod(transformedData);

问题来了。在proxy.OtherMethod调用时,本质上出现了这个异常:

HResult = -2146232969Message=没有找到接口的MethodDispatcherid '230348154' Source= microsoft . servicefabrice . actors

我在这里做错了什么吗?考虑到这个SO线程,我认为有可能从一个服务创建两个参与者…

不能在服务结构的一个ActorRuntime中注册两个actor

好了,我明白了。对于那些遇到困难的人来说,问题出在actor服务URI上。我错误地假设两个参与者共享服务URI。正如我在问题中提到的链接中所提到的,演员实际上是分开主持的。如果查看ServiceManifest.xml内部,将发现两个Extension xml节点,它们都命名为__GeneratedServiceType__。所需要做的就是根据子DefaultService xml节点更改服务名称部分,因此在本例中最有可能是ChildActorService。天哪,这听起来很不合适。

总而言之,Service Fabric中任何东西的设置和配置都相当复杂。然而,VS会尽力帮助你。有时你甚至没有预料到,这就是罪恶的根源。如果你不知道要找什么,你就不会去找它。

actor都注册得很好,当使用ActorProxy连接到它们时,如果指定服务名称,则需要指定正确的服务名称。您可以省略服务名称而指定applicationname, Actor框架将为Actor计算出正确的服务名称。详见https://msdn.microsoft.com/en-us/library/azure/mt694503.aspx