2017-02-23 91 views
4

grpc-java использует исполнитель в своем ServerBuilder, который, если он не определен методом builder.executor(), по умолчанию использует статический кешированный пул потоков. Каково точное использование этого исполнителя? Он просто выполняет методы обработчика или делает это «что-то еще»?Каково точное использование исполнителя в серверном сервере grpc-java? Выполняет ли он только методы обработчика?

Также, как grpc определяет сетчатого работника EventLoopGroup? В частности, я хочу знать, как рабочие потоки назначаются этой рабочей группе. Есть ли значение по умолчанию для количества потоков или оно зависит от количества ядер машины? Кроме того, в связи с вышеуказанным вопросом, как эти сетевые работники работают с исполнителем? Они обрабатывают только ввод/вывод - чтение и запись на канал?

Редактировать: Netty, по умолчанию создает (2 * количество ядер) рабочих потоков.

ответ

6

Предоставленный вами Executor - это то, что фактически выполняет обратные вызовы rpc. Это освобождает EventLoop, чтобы продолжить обработку данных о соединении. Когда новое сообщение поступает из сети, оно считывается в цикле событий, а затем передается стек исполнителю. Исполнитель принимает сообщения и передает их на ваш ServerCall.Listener, который фактически выполняет обработку данных.

По умолчанию gRPC использует пул кэшированных потоков, так что его очень легко начать. Однако настоятельно рекомендуется предоставить вашему собственнику. Причина в том, что по умолчанию threadpool ведет себя плохо под нагрузкой, создавая новые потоки, когда остальные заняты.

Чтобы настроить группу циклов событий, вы вызываете метод workerEventLoopGroup на NettyServerBuilder. gRPC не зависит от Netty (возможны другие переносы сервера), поэтому необходимо использовать специфический конструктор Netty.

+0

У gRPC есть рекомендуемый исполнитель для разных сценариев, так как настоятельно рекомендуется не использовать умолчания? – Matt

+1

Да, используйте пул потоков фиксированного размера. Что-то вроде 'Executors.newFixedThreadPool (16)' –

+0

благодарит Carl, поэтому подразумевается, что моя '* ServiceImplBase' должна быть потокобезопасной, если я добавлю один экземпляр' .addService (...) 'на мой сервер и имею несколько потоков отправка запросов? – Matt

 Смежные вопросы

  • Нет связанных вопросов^_^