2017-11-27 18 views
0

gRPC Java 서버 프로파일 링을 시도했습니다. 그리고 나는 아래의 스레드 풀 집합을 많이 볼 수 있습니다.gRPC 서버가 각 요청에 대해 새 스레드를 시작합니까?

  • grpc-default-executor 스레드 : 들어오는 요청마다 생성됩니다.
  • grpc-default-worker-ELG 스레드 : 들어오는 gRPC 요청을 수신 할 수 있습니다. & 위의 "grpc-default-executor"스레드에 할당합니다.

전체적으로 gRPC Java 서버, Netty 스타일 또는 Jetty/Tomcat 스타일입니까? 또는 두 가지 방법으로 실행되도록 구성 할 수 있습니까?

답변

0

GRPC 서버/클라이언트를 빌드 할 때 directExecutor()를 사용하여 모든 작업이 IO 스레드에서 수행되도록 보장 할 수 있으므로 스레드를 공유하도록 지정할 수 있습니다. 기본값은 IO 스레드에있을 때 수행 할 작업에 대해 매우 신중해야하므로 (안전하지 않기 위해) 안전상의 이유로이 작업을 수행하지 않는 것입니다.

0

gRPC Java 서버는 비동기식이라는 점을 제외하고는 Jetty/Tomcat 스타일에 가깝게 표시됩니다. 즉, 일반적인 서블릿에서는 각 요청이 완료 될 때까지 스레드를 소비합니다. 새로운 서블릿 버전에서는 전용 스레드에서 분리하여 더 자주 발생하는 비동기식 작업 (다른 용도로 쓰레드를 비우는 작업)을 계속할 수 있습니다. gRPC에서는 두 가지 스타일로 자유롭게 작업 할 수 있습니다. gRPC는 기본적으로 cachedThreadPool을 사용하여 스레드를 재사용합니다. 서버 측에서는 기본 실행 프로그램을 ServerBuilder.executor()을 통해 일반적으로 고정 크기의 풀로 대체하는 것이 좋습니다.

내부적으로 gRPC Java는 Netty 스타일을 사용합니다. 이는 완전히 비 차단이라는 의미입니다. Netty 스레드에서 실행하려면 ServerBuilder.directExecutor()을 사용할 수 있습니다. 이 경우 NettyServerBuilder.bossEventLoopGroup(), workerEventLoopGroup() 및 호환성 channelType()을 지정할 수도 있습니다.