Если вы используете grpc-java 1.21 или более поздней версии и grpc-netty-shaded
, вы уже должны использовать транспорт Netty Epoll. Если вы используете grpc-netty
, добавьте зависимость времени выполнения на io.netty:netty-transport-native-epoll
(правильную версию можно найти, посмотрев файл pom.xml grpc-netty
или таблицу версий в SECURITY.md ).
Исполнителем по умолчанию для обратных вызовов является «пул кэшированных потоков». Если вы не блокируете (или знаете пределы блокирования), указание пула потоков фиксированного размера может повысить производительность. Вы можете попробовать как Executors.newFixedThreadPool
, так и ForkJoinPool
;мы видели, как «оптимальный» выбор варьируется в зависимости от рабочей нагрузки. Вы указываете своего собственного исполнителя через ServerBuilder.executor()
и ManagedChannelBuilder.executor()
.
Если у вас высокая пропускная способность (~ Gbps + на клиента с TLS; выше, если открытый текст) с использованием нескольких каналов, можно повысить производительность с помощью нескольких соединений TCP. Каждое TCP-соединение прикрепляется к потоку, поэтому наличие большего количества TCP-соединений позволяет использовать больше потоков. Вы можете создать несколько каналов и затем циклически перебирать их;выбор другого для каждого RPC. Обратите внимание, что вы можете легко реализовать интерфейс Channel
, чтобы «скрыть» эту сложность от остальной части вашего приложения. Похоже, это обеспечит вам большой выигрыш, но я поставил его последним, потому что это обычно не нужно.