【问题标题】:Azure Service Fabric - Clone Actors with stateAzure Service Fabric - 克隆具有状态的 Actor
【发布时间】:2018-09-16 17:43:01
【问题描述】:

是否有任何方法可以克隆一个参与者及其状态,并在 Azure Service Fabric 的另一个应用程序中创建完全相同的参与者,具有相同的参与者 ID 及其对应的状态?我已经查看了备份和还原,但它似乎没有满足我的需求。
我们有几个相同应用程序类型的实例在生产中运行演员。我们需要这个功能有两个原因: 1. 我们需要将 2 个应用程序合并为一个,因此所有参与者都需要在其当前状态下重新创建,并在另一个实例中使用其当前 ID。 2.我们希望能够将生产克隆到另一个 Azure 服务器上的 QA 环境中,以便我们可以在生产所处的确切状态下测试升级和新代码。

非常感谢您对此的任何帮助!

【问题讨论】:

    标签: azure-service-fabric stateful-actor-service


    【解决方案1】:

    我认为没有内置的克隆支持。但我相信你可以实现自己的机制来做到这一点 - 你可以迭代你的演员来获取他们的状态,然后将它传递给另一个集群。 迭代:

    ` 
            var cancellationToken = new CancellationToken();
            ContinuationToken continuationToken = null;
            var actorProxyFactory = new ActorProxyFactory();
            var actorServiceProxy = ActorServiceProxy.Create("fabric:/MyActorApp/MyActorService", partitionKey);
    
            do
            {
                var queryResult = await actorServiceProxy.GetActorsAsync(continuationToken, cancellationToken);
                foreach (var item in queryResult.Items)
                {
                    var actor = actorProxyFactory.CreateActorProxy<IMyActor>("fabric:/MyActorApp/MyActorService", item.ActorId);
                    var state = await actor.GetState();
                }
    
                continuationToken = queryResult.ContinuationToken;
            } while (continuationToken != null);
    `
    

    如果您有演员状态的动态名称列表,您可以使用 GetStateNamesAsync 方法获取所有名称:

    IEnumerable<string> stateNames = await StateManager.GetStateNamesAsync();
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复!我会试一试并在一切正常后进行更新。
    【解决方案2】:

    对于#1,您需要使用Alex's solution 或类似名称。

    对于#2,您可以使用现有的backup & restore 机制。您正在恢复的服务的目标分区不必是您created the backup of 的源分区。

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 2017-07-11
      • 2017-07-19
      • 2017-06-22
      • 2016-09-19
      • 2016-07-23
      • 2017-07-14
      • 2016-11-08
      • 2016-10-31
      相关资源
      最近更新 更多