0

我有两个服务通过 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 };
}
4

0 回答 0