如何检查Azure Service Fabric是否已启动并正在运行?

时间:2017-01-23 17:27:55

标签: c# azure-service-fabric

有没有办法以编程方式检查Service Fabric是否已从外部客户端启动并运行?我想过只使用try catch块,但我很好奇是否有一种更优雅的方式。

2 个答案:

答案 0 :(得分:2)

没有单一的"集群在运行吗?"命令。可以通过不同的方式解释问题。

但是对于外部客户端,您可以做的最简单的检查就是尝试与群集通信。群集可能正在运行"但如果您的客户无法与之通信,那么它可以在那里停止。要以编程方式执行此操作,您必须捕获通信异常。这是一个例子:

FabricClient client = new FabricClient();

try
{
    await client.QueryManager.GetProvisionedFabricCodeVersionListAsync();
}
catch (FabricTransientException ex)
{
    if (ex.ErrorCode == FabricErrorCode.CommunicationError)
    {
         // can't communicate with the cluster!
    }
}

您基本上等待连接超时,因此完成此检查需要几秒钟。

答案 1 :(得分:0)

如果您的问题是:"如何检查Azure Service Fabric中的“我的服务”是否已启动并运行?"那你有一些选择。 (另一方面,如果您的问题是:"我如何检查Azure Service Fabric群集是否存在 正在运行?"然后你应该看看Vaclav's answer。)

创建FabricClient的新实例,现在您可以做很多有趣的事情,包括检查服务的健康状况。

如果您的群集是安全的(建议使用),那么您需要提供X509Credentials。您可以按照https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-connect-to-secure-cluster的这篇文章进行操作。

    var connection = "myclustername.westeurope.cloudapp.azure.com:19000";
    var fabricClient = new FabricClient(GetCredentials(clientCertThumb, serverCertThumb, CommonName), connection);

使用关联的管理器客户端,您可以检查部署到群集的服务的运行状况。

使用FabricClient.ServiceHealthManager检查各个分区:

var serviceHealth = await fabricClient.HealthManager.GetServiceHealthAsync(serviceName);
foreach (var serviceHealthPartitionHealthState in serviceHealth.PartitionHealthStates)
{
    Console.WriteLine($"Health state: {serviceHealthPartitionHealthState.PartitionId} {serviceHealthPartitionHealthState.AggregatedHealthState}");
}

使用FabricClient.QueryManagerClient检查每项服务的汇总运行状况:

var serviceList = await fabricClient.QueryManager.GetServiceListAsync(applicationName);
foreach (var service in serviceList)
{
    Console.WriteLine($"\tFound service {service.ServiceName} {service.ServiceStatus} {service.HealthState}");
}

如果其中任何一个评估为System.Fabric.Health.HealthState.Ok之外的其他任何内容,那么您的服务可能会遇到一些问题。