使用 grpc-java 在双向流中创建的流数量

问题描述 投票:0回答:1

我试图了解每当我使用 grpc-java 在双向流中使用 StreamObserver 对象发送请求时,在单个 grpc 连接中创建了多少个流 下面是我的代码上下文

StreamObserver<Response> responseStreamObserver1 = getResponseObserver();
StreamObserver<Response> responseStreamObserver2 = getResponseObserver();
StreamObserver<Request> streamClientSender1 = stub.sendRequest(responseStreamObserver1);
StreamObserver<Request> streamClientSender2 = stub.sendRequest(responseStreamObserver2);

我的问题是:

  1. 当我调用streamClientSender1.onNext(request)时,将创建一个流,当我再次调用它来发送另一个请求时,只要该流处于活动状态,直到最大连接年龄,就会使用相同的流
  2. 使用两个差异对象streamClientSender1和streamClientSender2将在客户端调用onNext时创建两个单独的流
  3. 有什么方法可以获取通话期间创建的流的 StreamID 并将其打印出来作为验证和上述问题的答案。

我尝试在服务器上打印对象并看到

  1. 当客户端发送具有相同对象的 diff 请求时,如果使用相同的responseObserver 来接收
  2. 如果在客户端使用 diff 发送者对象时创建 diff responseObserver 来接收

似乎上述两个条件在 时成立。但只是想验证它是否也适用于流。换句话说,流被映射到发送者对象(在上面的情况下是streamClientSender2和streamClientSender1),并且可以通过重用对象来发送或接收某些内容来重用它。

grpc grpc-java bidirectional
1个回答
0
投票

为每个 RPC 创建一个 HTTP/2 流。因此

stub.sendRequest(req)
创建了流,并且该流随着 RPC 的生命周期而存在。 (如果使用重试,事情会变得更加复杂,但这仍然是一个很好的心理模型。)

  1. 调用
    onNext()
    只需在现有流上发送消息
  2. 调用
    stub.sendRequest()
    两次会创建两个流
  3. gRPC 不会向用户公开其流 ID。用户与 RPC 交互

在服务器端,

responseObserver
实例不会影响创建的流数量。每个 RPC 只有一个流。如果您选择对两个 RPC 使用相同的responseObserver,那么您将拥有两个流,每个流都通知同一对象传入的消息。跨 RPC 共享 StreamObserver 是对 StreamObserver 的 API 违规,因为
onCompleted()
将被多次调用,并且对观察者的调用不会同步。

© www.soinside.com 2019 - 2024. All rights reserved.