ASP.net Core gRPC - остановить обработку запроса по таймауту
Есть некий микросервис общающийся по gRPC, в нем бывает суперредкое событие когда код зацикливается, выловить пока не получается но хочется обработать такое поведение - хочется чтобы код (поток?) обрывался по таймауту и в ответ на запрос отстрелить какую-то ошибку. Есть какие-то штатные приемы? Чет загуглить не получилось - а ранее с такими проблемами не сталкивался.
Ответы (1 шт):
Автор решения: Vasek
→ Ссылка
У каждого запроса есть параметр deadline и cancellationToken. Через них можно делать таймауты.
try {
var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" }, deadline: DateTime.UtcNow.AddSeconds(5));
Console.WriteLine("Greeting deadline: " + reply.Message);
}
catch (RpcException e) when (e.StatusCode == StatusCode.DeadlineExceeded) {
// nop
}
try {
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" }, cancellationToken: cts.Token);
Console.WriteLine("Greeting cts: " + reply.Message);
}
catch (RpcException e) when (e.StatusCode == StatusCode.Cancelled) {
// nop
}
На сервере так же можно получить что клиент послал отмену
public override async Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
try {
await Task.Delay(20_000, context.CancellationToken);
}
catch (OperationCanceledException) {
Console.WriteLine("cancel");
}
return new HelloReply() {
Message = "Hello " + request.Name
};
}