【问题标题】:gRPC: How can I distinguish bi-streaming clients at server side?gRPC:如何区分服务器端的双向流客户端?
【发布时间】:2019-03-28 09:29:25
【问题描述】:

在这个tutorialexample code 中,服务器可以在每个流观察器上调用onNext() 方法,这会将消息广播 到与服务器双向流的所有客户端。但是没有方法可以识别哪个观察者对应哪个客户端。服务器如何将消息推送到特定客户端而不是广播?

根据this answer,如果客户端 ID 由元数据提供,则可以映射每个观察者。似乎const auto clientMetadata = context->client_metadata(); 部分可以解决问题,但我使用的是 Java,而不是 C++。是否有任何 Java 等价物可以在服务器端获取元数据?

【问题讨论】:

    标签: grpc grpc-java


    【解决方案1】:

    答案在一定程度上取决于如何识别客户。如果初始请求提供了句柄(如用户名,但未提前注册),那么您可以等待第一个 onNext()

      public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
        return new StreamObserver<Chat.ChatMessage>() {
          @Override
          public void onNext(Chat.ChatMessage value) {
            String userHandle = value.getHandle();
            // observers would now be a map, not a set
            observers.put(userHandle, responseObserver);
            ...
    

    假设所有用户都已登录,并在标头中提供一个令牌,例如 OAuth。然后,您将使用拦截器对用户进行身份验证,并使用 Context 将其传播到应用程序,如 https://stackoverflow.com/a/40113309/4690866

      public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
        // USER_IDENTITY is a Context.Key, also used by the interceptor
        User user = USER_IDENTITY.get();
        observers.put(user.getName(), responseObserver);
        return new StreamObserver<Chat.ChatMessage>() {
            ...
    

    当识别仅适用于这个 RPC 时,第一个更容易/更好。当标识适用于许多 RPC 时,第二个更容易/更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2016-01-27
      • 2019-07-02
      • 1970-01-01
      相关资源
      最近更新 更多