了解服务结构actor删除

时间:2016-10-30 07:19:11

标签: c# actor azure-service-fabric

我正在运行本地5节点服务结构集群 为了更好地控制长时间演员,我想在需要时删除演员 参考deleting actorsenumerating actors的文档,我想出了以下代码

//create actor ID, get instance and call a method on the actor
ActorId id = ActorId.CreateRandom();
IActor1 myActor = ActorProxy.Create<IActor1>(id, new Uri(URI));
Console.WriteLine(myActor.GetCountAsync().GetAwaiter().GetResult() + "ActorID:" + id.GetPartitionKey());
IActorService myActorServiceProxy = ActorServiceProxy.Create(new Uri(URI), id);

//delete actor from Actor service
myActorServiceProxy.DeleteActorAsync(id, new CancellationToken()).GetAwaiter().GetResult();

//enumerate actors
IActorService actorServiceProxy = ActorServiceProxy.Create(new Uri(URI), id.GetPartitionKey());

ContinuationToken continuationToken = null;
List<ActorInformation> activeActors = new List<ActorInformation>();

do
{
  PagedResult<ActorInformation> page = actorServiceProxy
               .GetActorsAsync(continuationToken, new CancellationToken()).GetAwaiter().GetResult();

  activeActors.AddRange(page.Items.Where(x => x.IsActive));

  continuationToken = page.ContinuationToken;
}
while (continuationToken != null);
foreach(ActorInformation info in activeActors)
{
   Console.WriteLine("INFO:" + info.ActorId + ":" + info.IsActive);
}

//call the method again
Console.WriteLine(myActor.GetCountAsync().GetAwaiter().GetResult() + "ActorID:" + id.GetLongId());

我得到的输出是
0ActorID:1952475710829467062 0ActorID:1952475710829467062

其中0是方法的返回值 我知道演员已经从服务中删除,因为在foreach循环中没有打印任何内容,但是如果演员被删除,我对actor方法的第二次调用是如何成功的呢?它被重建了吗?请帮助我理解这一点。

1 个答案:

答案 0 :(得分:3)

  

[...]如果演员被删除,我对actor方法的第二次调用是如何成功的?它重新创建了吗?

是的,它被重新创建。

您应该阅读this article,它提供了演员生命周期管理的详细信息。以下是该文章的引用:

  

当一个演员来电并且一个人尚未激活时,会创建一个新演员。

这是你的程序所做的:

  1. 通过生成唯一的actor标识符来定义actor的实例。

  2. 调用已识别的actor。它不存在,因此激活了一个新实例。

  3. 删除该实例。

  4. 列举所有演员。什么都没有。

  5. 再次调用已识别的actor。它不存在(因为它已被删除),因此激活了一个新实例。