在不同的actor类型之间共享状态

时间:2016-08-05 07:31:55

标签: azure-service-fabric

我在一个项目中创建了两个actor Actor1和Actor2,并在Program.cs中注册了它们:

ActorRuntime.RegisterActorAsync<Actor1>();
ActorRuntime.RegisterActorAsync<Actor2>();

但在运行时我看到他们每个人都在不同的Actor Services中托管。当我通过Actor1中的StateManager在Reliable Collections中保存一些数据时,此状态不适用于Actor2。

是否可以在不同的演员类型之间共享状态?

1 个答案:

答案 0 :(得分:2)

首先,看起来你是以错误的方式使用演员。您应该为每个主机进程注册一个actor类型。例如

ActorRuntime.RegisterActorAsync<Actor1>((context, actorType) => 
                    new ActorService(
                        context, 
                        actorType,
                        () => new Actor1()))
.GetAwaiter()
.GetResult();

如果要在actor之间进行通信,则需要创建actor实例并在其接口上调用方法来保存数据。然后,如果要将相同数据保存在另一个actor中,则需要创建另一个实例。 设计的Actros是独特的,独立的实体。您可以从一个地方创建并创建两个actor并单独保存数据,或者您可以从第一个创建第二个actor。例如

var actor1Proxy = ActorProxy.Create<IActor1>(actorId, new Uri("fabric:/MyApp/Actor1"));
var actor2Proxy = ActorProxy.Create<IActor2>(actorId, new Uri("fabric:/MyApp/Actor2"));

actor1Proxy.SaveData(data);
actor2Proxy.SaveData(data);

您可能需要可靠的服务来存储数据。有关如何使用演员的更多信息,请阅读thisthis文章。