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

时间:2019-01-29 13:39:17

标签: c# azure-service-fabric cancellation-token

我正在尝试使用FabricClient API来模拟正常故障(例如分区/副本/实例重新启动),但是由于某些原因,该服务一直在恢复。

唯一成功的方法是从群集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导致服务似乎重新启动,但是随后又成功了。

2 个答案:

答案 0 :(得分:1)

取消令牌在某些情况下被取消,而大多数情况下主要是出于维护原因,它们可能是:

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

在某些其他事件中,服务被强制关闭,并且未调用令牌,例如,当您调用Restart-ServiceFabricDeployedCodePackage Restart-ServiceFabricPartitionRestart-ServiceFabricNode

答案 1 :(得分:0)

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

(不确定您要完成的工作。但是,如果您想进行一些受控的混沌测试,很高兴知道有PowerShell tasks可以为您提供帮助。)