grpc完成异步java服务请求/响应映射

时间:2018-02-27 14:26:12

标签: rpc grpc grpc-java

Java服务(让我们称之为门户网站)既是gRPC客户端,也是服务器。它服务于数百万个gRPC客户端(服务器),每个客户端请求一些任务/资源。根据传入的请求,门户网站将找出后端服务并与其中一个或多个进行通信,并将返回的响应发送给始发客户端。因此,这里的要求是:

  1. 数以百万计的客户将有自己的超时
  2. 门户网站不应该有数百万个客户端的线程阻塞(异步)。它也不应该为每个客户端对后端服务(异步)的调用阻塞线程。我们可以使用接收客户端调用的相同线程来调用后端服务。
  3. 如果原始客户端超时,则门户应该能够将其传递给后端服务或终止对后端服务的特定调用。
  4. 来自后端服务的错误,门户应该能够将其传回给呼叫失败的特定客户端。
  5. 所以这里的问题是:

    1. 我们必须在这里使用异步一元调用,对吗?
    2. 中间服务器(门户)如何将原始请求与后端服务的响应匹配?
    3. 如果后端服务出错,中间服务器如何传播错误?
    4. 中间服务器如何传播截止日期?
    5. 如果原始客户端终止,中间服务器如何取消后端服务上的请求?

1 个答案:

答案 0 :(得分:1)

gRPC Java可以相对容易地创建代理。对这样的代理使用异步存根很常见。当代理创建其传出RPC时,它可以在传出RPC的回调中保存对原始RPC的引用。当传出RPC的回调触发时,只需对原始RPC发出相同的调用。这解决了消息和错误。

截止日期和取消传播由io.grpc.Context自动处理。

您可能想要引用this grpc-level proxy example(尚未合并到grpc / grpc-java)。它使用ClientCall / ServerCall,因为它很方便,因为它不想解析消息。可以使用StreamObserver API执行相同的操作。

这种代理的主要困难是观察流量控制。我引用的例子就是这样做的。如果使用StreamObserver API,则应将传递到服务器的StreamObserver强制转换为ServerCallStreamObserver,并通过将ClientCallStreamObserver传递给客户端存根来获取ClientResponseObserver