【问题标题】:Share state between different actor types在不同的参与者类型之间共享状态
【发布时间】:2016-08-05 17:00:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: azure-service-fabric


    【解决方案1】:

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

    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 文章,了解有关如何使用actors 的更多信息。

    【讨论】:

    • 是的,一般来说,您应该在不同的进程中托管演员,因为您可以独立升级一个进程。但是,您可以在同一进程中托管多个演员类型。
    • @VipulM-MSFT 是的,我们甚至有 an answer 关于这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多