在 ServiceFabric 的 RunAsync() 中模拟取消令牌请求

Simulate cancellation token request in RunAsync() at ServiceFabric

我正在尝试使用 FabricClient API 来模拟正常故障(例如 partition/replica/instance 重启),但由于某种原因,服务一直在恢复。

它最终成功的唯一一次是当我从集群中手动删除服务时 UI,然后我看到它被卡住了,因为 RunAsyc 被卡住了。 (我写了一个不接受取消令牌的特殊虚拟服务。)

这些是我的尝试:

foreach (var service in Services)
        {
            var partitions = FabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).Result;
            foreach (var partition in partitions)
            {
                var operationGuid = Guid.NewGuid();
                restartOperationsIds.Add(operationGuid);
                var partitionId = partition.PartitionInformation.Id;

                FabricClient.FaultManager.RestartReplicaAsync(
                    ReplicaSelector.PrimaryOf(PartitionSelector.PartitionIdOf(service.ServiceName, partitionId)),
                    CompletionMode.Verify, CancellationToken.None);

                FabricClient.TestManager.StartPartitionRestartAsync(operationGuid,
                    PartitionSelector.PartitionIdOf(service.ServiceName, partitionId),
                    RestartPartitionMode.AllReplicasOrInstances, TimeSpan.FromMinutes(2));
            }
        }

RestartReplicaAsync 似乎没有做任何事情,而 StartPartitionRestartAsync 导致服务看似重新启动,但随后又成功了。

很可能另一个副本成为主要副本,而您无需执行任何操作。重新启动分区会导致所有副本重新启动,而不仅仅是主副本。

(不确定你想用这个完成什么。但是如果你想做一些受控的混沌测试,很高兴知道有 PowerShell tasks 可以帮助你。)

注销令牌在少数场景下被注销,这些场景大多主要是出于维护原因,可能是:

  • 升级:服务已关闭以进行更新,重新启动时将调用 RunAsync()。
  • 按比例缩小:副本在按比例缩小时被删除并且不调用 RunAsync
  • 负载平衡:当 SF 需要移动服务时,将调用 RunAsync。
  • Node Deactivation(Restart\RemoveData): SF会将服务转移到其他节点,触发取消以正常关闭。
  • 删除Application\Service:当您从集群中删除服务或应用程序时。

还有一些其他的事件,服务被强制关闭,没有调用token,一个例子是当你调用Restart-ServiceFabricDeployedCodePackage Restart-ServiceFabricPartition or Restart-ServiceFabricNode