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

Share state between different actor types

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

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

但在运行时我看到它们中的每一个都托管在单独的 Actor 服务中。当我通过 Actor1 中的 StateManager 将一些数据保存在 Reliable Collections 中时,该状态对 Actor2 不可用。

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

首先,您似乎以错误的方式使用了 actors。您应该为每个主机进程注册一种参与者类型。例如

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

如果你想在actor之间进行通信,你需要创建actor实例并在它的接口上调用一个方法来保存数据。然后,如果你想在另一个actor中保存相同的数据,你需要创建另一个实例。 Actros 按照设计是独特的、独立的实体。您可以从一个地方创建两个 actor 并分别保存数据,或者您可以从第一个 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);

您可能需要可靠的服务来存储您的数据。请阅读 this and this 篇文章,了解有关如何使用 actor 的更多信息。