【问题标题】:Java gRPC server streaming modelJava gRPC 服务器流模型
【发布时间】:2023-03-27 14:16:01
【问题描述】:

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

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

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

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

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

期待可以解决此问题的示例。

【问题讨论】:

    标签: android grpc mobile-application grpc-java


    【解决方案1】:

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

    您可以将阻塞或异步 API 用于服务器流式 RPC。示例中使用了阻塞 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();
    

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2020-05-31
      • 1970-01-01
      相关资源
      最近更新 更多