在 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
我正在尝试使用 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