Использование одного и того же потокового итератора сервера gRPC со многими клиентами - PullRequest
0 голосов
/ 29 мая 2019

Мы пишем приложение, которое использует gRPC.Мы реализовали несколько унарных RPC, которые клиенты могут регулярно вызывать, получая ожидаемый ответ.

Кроме того, у нас есть поток (от сервера к клиенту), предназначенный для непрерывной потоковой передачи некоторой информации, которая совместно используется всеми клиентами (скажем, некоторые аппаратные данные о локальных датчиках - например, комнатные температуры).

Функция Python StatusStreaming теперь возвращает потоковый итератор и постоянно выполняет цикл для потоковой передачи данных клиентам.

Проблема возвращает новый итератор для каждого клиента ;благодаря обновлению каждые 100 мс наша система не сможет обслуживать более десятка клиентов до полной загрузки.Кроме того, не имеет смысла использовать отдельный цикл для каждого клиента, так как нам нужно отправить одинаковое точное содержимое всем клиентам.

Возможно ли транслировать один и тот же потоковый контентдля многих клиентов без разного соединения / канала для каждого из них?

Некоторый фон

Мы используем gRPC-web для реализации RPC на клиентских браузерах, поэтому потоковая передача двунаправленного текста невозможна(Я не знаю, как его использовать, так или иначе, но он не будет доступен).

Версии используются для привязки к grpc-web (версия grpc grpc @ d8772cf и protobuf на 3.7.0).

Наш сервер ограничен в ресурсах, так как мы на небольшом встроенномсервер (1 ядро, 1 ГБ ОЗУ).

Вот стример


# Inside a method of the service class here
def _Status(self):
    system_controller = self._system_status()
    return protos.Stream(temperature_controller)

# Real Python streaming method
def Status(self, request, context):
    def streaming_iterator():
       while(context.is_active()):
           time.sleep(0.5)
           yield self._Status()
       return streaming_iterator()

Для каждого клиента создается новое соединение (а также выделенный канал потоковой передачи)и поэтому новый цикл while порождает генерацию данных для отправки.Это поведение не требуется, потому что одна и та же информация может фактически передаваться всем клиентам в широковещательной моде.

...