Java gRPC 服务器流模型

Java gRPC server streaming model

我通过以下示例寻找用于服务器端流式传输的客户端侦听器示例 - https://grpc.io/docs/languages/java/basics/

我已经按照文档在客户端和服务器上配置了 keep-alive 配置 - https://github.com/grpc/grpc/blob/master/doc/keepalive.md

所有示例都表明,当向服务器发出请求时,服务器将以异步或一元模型响应,或者客户端可以与新请求聊天。每次请求都必须发送到服务器以响应。 Connection 存活的时间更长;哪个好

问题:客户端是否可以在不使用BIDI(双向)模型的情况下发送一个请求并无限期地接收来自服务器的响应?在这种情况下,它在某种程度上是基于事件的,只要服务器上有可用数据,它将继续发送而无需进一步请求。同样,这种通信是单播,而不是广播;这意味着每个连接(用户)都是唯一的,可以根据用户的数据进行响应。

不确定,但一种方法可能是 - 服务器使请求对象在某处的缓存中保持活动状态并保持响应?客户端是否必须使用轮询循环无限期地侦听响应?

期待能解决这个问题的例子。

一个客户端请求和多个服务器响应是“服务器流”。您可以仅针对响应使用 stream 关键字。

您可以对服务器流式 RPC 使用阻塞或异步 API。示例中使用了阻塞API,因为阻塞操作在一般情况下更加清晰。但是也可以使用异步存根。

对于服务器流,异步客户端 API 让您传递请求和响应观察器以启动调用。之后,它看起来与 bidi 示例相同,只是客户端不会再发送任何消息。服务端只要想发送消息就可以调用StreamObserver,客户端的StreamObserver会在有新​​消息到达时调用。

要查看示例,您可以将 the blocking stub of listFeatures() 替换为异步存根:

final CountDownLatch finishLatch = new CountDownLatch(1);
asyncStub.listFeatures(request, new StreamObserver<Feature>() {
  int i;

  @Override public void onNext(Feature feature) {
    info("Result #" + i + ": {0}", feature);
    if (testHelper != null) {
      testHelper.onMessage(feature);
    }
    i++;
  }

  @Override public void onCompleted() {
    finishLatch.countDown();
  }

  @Override public void onError(Throwable t) {
    warning("RPC failed: {0}", Status.fromThrowable(t));
    if (testHelper != null) {
      testHelper.onRpcError(t);
    }
    finishLatch.countDown();
  }
});
finishLatch.await();