目前,我正试图在我的健康检查清单中诊断出需要时间的地方。我有多项健康检查,需要多个数据库。我还有一个系统定期调用健康检查端点,但是这个系统的超时时间非常短(~10秒)。
监视系统到达10秒超时后,它将取消请求。目前的健康检查,我只检查一个取消的要求在其中一个检查。这将导致应用程序抛出预期的异常。
我的问题是,正如标题所说,这些健康检查是一个接一个地进行,还是并行进行。我正在尝试诊断哪个DB导致延迟,并希望在取消检查之前检查它是否可能是一个检查。
发布于 2022-07-28 12:18:32
默认HealthCheckService并行运行所有检查:
foreach (var registration in registrations)
{
tasks[index++] = Task.Run(() => RunCheckAsync(registration, cancellationToken), cancellationToken);
}
await Task.WhenAll(tasks).ConfigureAwait(false);这并不意味着健康检查方法可以免费运行昂贵的阻塞代码。正在运行检查的线程(和内核)不能用于服务器请求。
不过,Xabaril 数据库健康检查完全异步:
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
try
{
using (var connection = new SqlConnection(_connectionString))
{
_beforeOpenConnectionConfigurer?.Invoke(connection);
await connection.OpenAsync(cancellationToken);
using (var command = connection.CreateCommand())
{
command.CommandText = _sql;
_ = await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false);
}
return HealthCheckResult.Healthy();
}
}
catch (Exception ex)
{
return new HealthCheckResult(context.Registration.FailureStatus, exception: ex);
}
}
}https://stackoverflow.com/questions/73152411
复制相似问题