Health Manager中的天蓝色服务结构资源管理器中的服务运行状况不会更新?

时间:2016-11-09 12:14:14

标签: c# azure azure-service-fabric

如果这个问题听起来很模糊,我道歉。这是我观察到的情景。

我创建了一个带有2个无状态服务的天蓝色服务结构应用程序(POC)。

  1. Service-1最初在第一次迭代中将其健康状况报告为确定 ,时间为5分钟,等待2分钟(随机配置等待2分钟)。
  2. 10秒后,Service-2将其健康状况报告为错误 ,生存时间为10 它的第一次迭代。即使这等了2分钟。
  3. 此时,Service Fabric Explorer正确显示Service-1's状态为OK,Service-2's状态为Error。 AS EXPECTED

    1. 同时,Service-1的第二次迭代开始并将其状态报告为 ERROR
    2. Service-2 的第二次迭代也会启动并立即将其状态报告为确定
    3. 预期:服务架构资源管理器会将Service-1's状态显示为ERROR,并将Service-2's状态显示为OK。

      ACTUAL :两项服务都显示为错误。

      服务结构资源管理器是否每次刷新时都会从Health Manager获取健康状况?如果是这样,为什么我会将这两种服务的状态显示为错误?

      以下代码供参考:服务-1:

      long iterations = 0;
      if (iterations++%2 == 0)
      {
          var healthInformation = new HealthInformation("Service-1", $"{this.Context.ServiceName}-OK-{iterations}-Property",
              HealthState.Ok);
          healthInformation.TimeToLive = TimeSpan.FromSeconds(300);
          var healthReport = new StatelessServiceInstanceHealthReport(this.Context.PartitionId,
              this.Context.InstanceId, healthInformation);
          fabricClient.HealthManager.ReportHealth(healthReport);
          ServiceEventSource.Current.ServiceMessage(this, "Logged OK health from {0}", this.Context.ServiceName);
          await Task.Delay(TimeSpan.FromSeconds(120), cancellationToken);
      }
      else
      {
          var healthInformation = new HealthInformation("Service-1", $"{this.Context.ServiceName}-Error-{iterations}-Property",
              HealthState.Error);
          healthInformation.TimeToLive = TimeSpan.FromSeconds(10);
          var healthReport = new StatelessServiceInstanceHealthReport(this.Context.PartitionId,
              this.Context.InstanceId, healthInformation);
          fabricClient.HealthManager.ReportHealth(healthReport);
          ServiceEventSource.Current.ServiceMessage(this, "Logged Error health from {0}", this.Context.ServiceName);
          await Task.Delay(TimeSpan.FromSeconds(120), cancellationToken);
      }
      

      服务-2:

      long iterations = 0;
      if (iterations++ % 2 == 0)
      {
          var healthInformation = new HealthInformation("StatelessService2", $"{this.Context.ServiceName}-Error-{iterations}-Property",
              HealthState.Error);
          healthInformation.TimeToLive = TimeSpan.FromSeconds(10);
          var healthReport = new StatelessServiceInstanceHealthReport(this.Context.PartitionId,
              this.Context.InstanceId, healthInformation);
          fabricClient.HealthManager.ReportHealth(healthReport);
          ServiceEventSource.Current.ServiceMessage(this, "Logged Error from {0}" , this.Context.ServiceName);
          await Task.Delay(TimeSpan.FromSeconds(120), cancellationToken);
      }
      else
      {
          var healthInformation = new HealthInformation("StatelessService2", $"{this.Context.ServiceName}-OK-{iterations}-Property",
              HealthState.Ok);
          healthInformation.TimeToLive = TimeSpan.FromSeconds(300);
          var healthReport = new StatelessServiceInstanceHealthReport(this.Context.PartitionId,
              this.Context.InstanceId, healthInformation);
          fabricClient.HealthManager.ReportHealth(healthReport);
          ServiceEventSource.Current.ServiceMessage(this, "Logged OK from {0}" ,this.Context.ServiceName);
          await Task.Delay(TimeSpan.FromSeconds(120), cancellationToken);
      }
      

1 个答案:

答案 0 :(得分:0)

由于第二个健康属性与第一个健康属性不同(因为您根据迭代命名它们),因此第一个健康属性将保留到其TTL,然后其行为由RemoveWhenExpired属性定义(即默认情况下为false,因此它将保持不变)。第一个属性不会被“OK”健康报告覆盖,因为这是一个"不同的属性"。在SFX我打赌你实际上会看到这两个属性。他们需要具有相同的名称才能以您期望的方式工作。更多信息是here