理解服务结构参与者的删除

本文关键字:删除 参与者 结构 服务 | 更新日期: 2023-09-27 18:15:36

我正在运行一个本地5节点服务fabric集群。
为了更好地控制长时间运行的演员,我想在需要时删除演员。
参考删除演员和枚举演员的文档,我想出了以下代码

//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为方法的返回值。
我知道actor已从服务中删除,因为在foreach循环中没有打印任何内容,但是如果actor被删除,我对actor方法的第二次调用如何成功?是重建的吗?请帮我理解一下。

理解服务结构参与者的删除

[…如果actor被删除,我对actor方法的第二次调用是如何成功的?是重建的吗?

是的,它被重新创建了。

您应该阅读这篇文章,它提供了参与者生命周期管理的细节。下面是那篇文章的摘录:

当一个actor被调用而一个actor还没有被激活时,一个新的actor被创建。

这是你的程序所做的:

  1. 通过生成唯一的参与者标识符来定义一个参与者的实例。

  2. 调用标识的参与者。

  3. 删除实例

  4. 枚举所有参与者。

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