gRPC: Как я могу различить двухпотоковых клиентов на стороне сервера? - PullRequest
0 голосов
/ 28 марта 2019

В этом учебнике и пример кода сервер может вызывать метод onNext() для каждого потокового наблюдателя, который передает сообщения всем клиентампотоковая передача с сервера.Но нет способа определить, какой наблюдатель соответствует какому клиенту.Как сервер может отправить сообщение конкретному клиенту вместо широковещательной рассылки?

Согласно этому ответу можно сопоставить каждого наблюдателя, если идентификатор клиента предоставляется метаданными.Кажется, const auto clientMetadata = context->client_metadata(); часть делает свое дело, но я работаю с Java, а не C ++.Есть ли какой-нибудь Java-эквивалент для получения метаданных на стороне сервера?

1 Ответ

1 голос
/ 03 апреля 2019

Ответ немного зависит от того, как будут идентифицироваться клиенты.Если первоначальный запрос предоставлял дескриптор (например, имя пользователя, но не был зарегистрирован заранее), то вы могли бы просто дождаться первого 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.

...