如果这个问题听起来很模糊,我道歉。这是我观察到的情景。
我创建了一个带有2个无状态服务的天蓝色服务结构应用程序(POC)。
Service-1
最初在第一次迭代中将其健康状况报告为确定 ,时间为5分钟,等待2分钟(随机配置等待2分钟)。Service-2
将其健康状况报告为错误 ,生存时间为10 秒 它的第一次迭代。即使这等了2分钟。此时,Service Fabric Explorer正确显示Service-1's
状态为OK,Service-2's
状态为Error。 AS EXPECTED 。
Service-1
的第二次迭代开始并将其状态报告为 ERROR 。 预期:服务架构资源管理器会将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);
}
答案 0 :(得分:0)
由于第二个健康属性与第一个健康属性不同(因为您根据迭代命名它们),因此第一个健康属性将保留到其TTL,然后其行为由RemoveWhenExpired属性定义(即默认情况下为false,因此它将保持不变)。第一个属性不会被“OK”健康报告覆盖,因为这是一个"不同的属性"。在SFX我打赌你实际上会看到这两个属性。他们需要具有相同的名称才能以您期望的方式工作。更多信息是here。