我试图了解每当我使用 grpc-java 在双向流中使用 StreamObserver 对象发送请求时,在单个 grpc 连接中创建了多少个流 下面是我的代码上下文
StreamObserver<Response> responseStreamObserver1 = getResponseObserver();
StreamObserver<Response> responseStreamObserver2 = getResponseObserver();
StreamObserver<Request> streamClientSender1 = stub.sendRequest(responseStreamObserver1);
StreamObserver<Request> streamClientSender2 = stub.sendRequest(responseStreamObserver2);
我的问题是:
我尝试在服务器上打印对象并看到
似乎上述两个条件在 时成立。但只是想验证它是否也适用于流。换句话说,流被映射到发送者对象(在上面的情况下是streamClientSender2和streamClientSender1),并且可以通过重用对象来发送或接收某些内容来重用它。
为每个 RPC 创建一个 HTTP/2 流。因此
stub.sendRequest(req)
创建了流,并且该流随着 RPC 的生命周期而存在。 (如果使用重试,事情会变得更加复杂,但这仍然是一个很好的心理模型。)
onNext()
只需在现有流上发送消息stub.sendRequest()
两次会创建两个流在服务器端,
responseObserver
实例不会影响创建的流数量。每个 RPC 只有一个流。如果您选择对两个 RPC 使用相同的responseObserver,那么您将拥有两个流,每个流都通知同一对象传入的消息。跨 RPC 共享 StreamObserver 是对 StreamObserver 的 API 违规,因为 onCompleted()
将被多次调用,并且对观察者的调用不会同步。