我有两个服务通过 gRPC(A 调用 B)进行通信,取消令牌为 X 秒。
B 服务处理请求的时间可能比允许的时间长。在这种情况下,我想返回一个部分结果(如果有的话)并在服务 A 中接收它。
问题:如果可能,我怎样才能在服务 A 中获取返回的结果?如果没有,没有什么替代方案?
从文档来看,双方都独立跟踪截止日期,因此它无法工作。我假设 CancellationToken 也是如此。
AC#/伪代码示例。服务 A 调用 B 的时间限制为 3 秒,B 将需要 10 秒才能完成,并且将始终被取消。我想收到值 100,如果在服务 A 的示例案例中取消,则返回。
服务一:
public async Task<int> GetNumberFromB()
{
try
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3));
var result = await _clientB.GetNumber(new GetNumberRequest(), cancellationToken: cts.Token);
return result.Value;
}
catch (RpcException e)
{
// Get result (100) here
}
return 0;
}
服务乙:
public async Task<GetNumberReply> GetNumber(GetNumberRequest request, ServerCallContext context)
{
int value = 0;
try
{
// It will always be longer than the 3 seconds as request
await Task.Delay(TimeSpan.FromSeconds(10), context.CancellationToken);
value = 1;
}
catch (OperationCancelledException ex)
{
// Reached after three seconds, when service A calls the
value = 100;
}
return new GetNumberReply { Value = value };
}