在不同的 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 的更多信息。
我在一个项目中创建了两个演员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 的更多信息。