【问题标题】: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();
希望这会有所帮助。