1

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

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

4

2 回答 2

0

对于#1,您需要使用Alex 的解决方案或类似的解决方案。

对于#2,您可以使用现有的备份和恢复机制。您正在还原的服务的目标分区不必是您创建备份的源分区。

于 2018-04-09T18:13:10.540 回答
0

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

` 
        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();

希望这会有所帮助。

于 2018-04-08T10:44:48.740 回答