代码之家  ›  专栏  ›  技术社区  ›  Daniel Rahamim

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

  •  0
  • Daniel Rahamim  · 技术社区  · 5 年前

    我试图使用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));
                }
            }
    

    2 回复  |  直到 5 年前
        1
  •  1
  •   Diego Mendes    5 年前

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

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

    还有一些其他事件,其中服务被强制关闭,而令牌没有被调用,例如当您调用 Restart-ServiceFabricDeployedCodePackage Restart-ServiceFabricPartition Restart-ServiceFabricNode

        2
  •  0
  •   LoekD    5 年前

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

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