Node JS: вызовет ли двунаправленный GRP C вызов нескольких подключений http2? - PullRequest
0 голосов
/ 31 марта 2020

Будет ли двунаправленный вызов RP C когда-либо открывать несколько соединений http2?

Я пишу клиент GRP C, который общается с сервером GRP C, которым я не владею / не контролирую. Я использую пакет @ grpc / grp c - js. Меня спросили, будет ли эта библиотека открывать несколько соединений HTTP2 с конечной точкой grp c, и я недостаточно знаком с исходным кодом, чтобы ответить на этот вопрос. Мой код для вызова и открытия потока выглядит следующим образом

const protoLoader = require('@grpc/proto-loader')

const packageDefinition = protoLoader.loadSync(
  __dirname + '/path/to/v1.proto',
  {keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
  })

const packageDefinition = grpc.loadPackageDefinition(packageDefinition).com.foo.bar.v1
const client = new packageDefinition.IngestService(
  'server.url.here.com:443',
  grpc.credentials.createSsl()
)

const stream = client.doTheThing(metadata)        

Я сам начал изучать это и вижу, что Subchannel объекты инициируют соединения http2 , поэтому кажется, что это одно соединение http2 на подканал. Однако связь между вызовом, потоком http2call, основным каналом, подканалом (ями), балансировщиком нагрузки и стеками фильтров мне неясна, и я не могу рассуждать о том, когда (если вообще) второе соединение HTTP2 когда-либо будет открыто.

В идеале, если кто-то может ответить на вопрос Будет ли двунаправленный RP C Вызовить несколько подключений http2? это было бы здорово. Если это слишком сложный ответ, я бы согласился с теорией работы о том, какими должны быть отношения между этими различными объектами, чтобы я сам мог рассуждать об этом, или что-нибудь еще, что, как вы думаете, могло бы помочь.

1 Ответ

2 голосов
/ 31 марта 2020

Независимо от того, какой тип потока используется в запросе, gRP C будет использовать каждое одно соединение , чтобы открыть несколько потоков . Это одна из основных причин, по которой HTTP / 2 был выбран в качестве базового протокола для gRP C: мультиплексирование потоков в соединения уже является частью этого протокола.

Из упомянутых вами классов Channel - это API -уровень абстракции над связями. Канал представляет любое количество соединений с бэкэндами, на которые ссылается целевая строка. Он автоматически установит sh соединения, необходимые для обработки любых инициированных запросов.

Resolver, который вы не упомянули, определяет, какие адреса внутренних серверов связаны с целевой строкой. Например, DnsResolver будет искать записи DNS.

A LoadBalancer определяет, какие конкретно c соединения устанавливаются sh и как распределять запросы между этими соединениями. Политика балансировки нагрузки по умолчанию «выберите сначала» просто отправляет все запросы в зависимости от того, какое соединение успешно установлено первым. Существует также политика балансировки нагрузки «Round Robin», которая пытается установить sh соединений с несколькими бэкэндами, а затем циклически перебирает их при запуске вызовов.

A Subchannel представляет соединение с одним бэкэндом, его можно восстановить, если он упадет.

Стек фильтров применяет некоторые преобразования к запросам между моментом их инициирования в API верхнего уровня и отправкой их по сети.

...