Java 클라이언트 라이브러리와 함께 gRPC 사용

데이터 저장소 모드용 Java 클라이언트는 gRPC를 전송 계층 옵션으로 제공합니다. gRPC 연결 풀링을 사용하면 여러 연결에 RPC를 분산할 수 있어 성능이 향상될 수 있습니다.

시작하기 전에

최신 버전의 google-cloud-datastore 라이브러리를 설치합니다.

gRPC 전송 동작을 사용 설정하는 방법

gRPC 전송 동작을 사용 설정하려면 클라이언트 인스턴스화에 setTransportOptions를 추가합니다.

자바
DatastoreOptions datastoreOptions =
       DatastoreOptions.newBuilder()
               .setProjectId("my-project")
               .setDatabaseId("my-database")
               .setTransportOptions(GrpcTransportOptions.newBuilder().build())
               .build();

전송 옵션을 GrpcTransportOptions로 명시적으로 설정하면 서버를 호출할 때 HTTP 대신 gRPC를 사용하도록 클라이언트가 구성됩니다.

gRPC 전송 동작 비활성화

HTTP 전송 동작으로 되돌려 gRPC 전송 동작을 비활성화할 수 있습니다. 이렇게 하려면 .setTransportOptions 코드 줄을 삭제하거나 GrpcTransportOptionsHttpTransportOptions로 바꿉니다. 애플리케이션을 다시 빌드하고 다시 시작해야 합니다.

자바
// Use this code to deactivate the gRPC transport behavior
// by reverting to the HTTP transport behavior.
DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder()
            .setProjectId("my-project")
            .setDatabaseId("my-database")
            .build();

// You can also use this code to revert to the HTTP transport behavior
DatastoreOptions datastoreOptions =
            DatastoreOptions.newBuilder()
                    .setProjectId("my-project")
                    .setDatabaseId("my-database")
                    .setTransportOptions(HttpTransportOptions.newBuilder()
                            .setConnectTimeout(1000)
                            .build())
                    .build();

교통 옵션 확인

클라이언트가 사용하는 TransportOptions 유형을 확인하려면 전송 옵션 유형을 검사하세요.

자바
// Compares datastore transport options type

boolean isGRPC = datastore.getOptions().getTransportOptions() instanceof GrpcTransportOptions;

boolean isHTTP = datastore.getOptions().getTransportOptions() instanceof HTTPTransportOptions;

연결 풀 구성

연결 풀(채널 풀이라고도 함)은 클라이언트가 연결 지연 시간과 성능을 개선하기 위해 공유하고 재사용하는 데이터베이스 연결의 캐시입니다. 애플리케이션의 성능을 개선하려면 연결 풀을 구성하세요.

이 섹션에서는 최적의 연결 풀 크기를 결정하는 방법을 설명하고 Java 클라이언트 라이브러리 내에서 연결 풀을 구성하는 방법을 보여줍니다.

최적의 연결 풀 크기 결정

기본 연결 풀 크기는 대부분의 애플리케이션에 적합하며 대부분의 경우 변경할 필요가 없습니다. 하지만 높은 처리량이나 버퍼링된 요청으로 인해 연결 풀 크기를 변경해야 할 수도 있습니다.

트래픽 변동에 대해 여지를 남겨 두기 위해 연결 풀은 포화도를 최대화하기 위해 필요한 연결 수의 약 2배를 차지하는 것이 가장 좋습니다. 연결 하나에서 동시 요청을 최대 100개까지 처리할 수 있으므로 대기 요청은 연결당 10~50개가 가장 좋습니다. 미들웨어 레이어는 gRPC 연결당 동시 스트림 한도를 100개로 적용하며 이 한도는 구성할 수 없습니다. 예상 클라이언트당 QPS와 평균 지연 시간 수를 사용하여 연결 풀의 최적 연결 수를 계산하려면 다음 단계를 따르세요.

클라이언트 측 측정항목에서 다음 정보를 수집하고 다음 계산을 실행합니다.

  1. 애플리케이션이 워크로드를 실행할 때 클라이언트별 최대 초당 쿼리 수 (QPS)를 확인합니다.
  2. 밀리초(ms) 단위의 평균 지연 시간(단일 요청의 응답 시간)을 확인합니다.
  3. 1,000을 평균 지연 시간 값으로 나누어 순차적으로 전송할 수 있는 초당 요청 수를 결정합니다.
  4. QPS(초 단위)를 초당 직렬 요청 수로 나눕니다.
  5. 최소 최적 연결 풀 크기를 결정하려면 결과를 채널당 요청 50개로 나눕니다. (계산이 2보다 작으면 채널을 2개 이상 사용하여 중복성을 보장합니다.)
  6. 최대 최적 연결 풀 크기를 결정하려면 동일한 결과를 채널당 요청 10개로 나눕니다.

이 단계를 수행하려면 다음 방정식을 사용하세요.

(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 50 streams = Minimum optimal number of
connections

(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 10 streams = Maximum optimal number of
connections

예를 들어 애플리케이션에서 일반적으로 초당 50,000개의 요청을 전송하며 평균 지연 시간은 10밀리초입니다. 1,000을 10밀리초로 나눠 초당 100개의 요청을 순차적으로 보낼 수 있는지 확인합니다. QPS 50,000개를 전송하는 데 필요한 동시 로드를 구하려면 해당 숫자를 50,000으로 나눕니다. 그러면 500이 됩니다.

각 채널에는 요청이 동시에 최대 100개까지 있을 수 있으며 대상 채널 사용률은 동시 스트림 10~50개입니다. 따라서 최소 연결 풀 크기를 계산하려면 500을 50으로 나눠 10을 구합니다. 최대 연결 풀 크기를 찾으려면 500을 10으로 나눠 50을 구합니다.

즉, 이 예시의 연결 풀 크기는 연결 10~50개입니다. 이러한 변경 후 트래픽을 모니터링하고 필요한 경우 풀의 연결 수를 조정하는 것도 중요합니다.

풀 크기 설정

다음 코드 샘플은 DatastoreOptions를 사용하여 클라이언트 라이브러리에서 연결 풀을 구성하는 방법을 보여줍니다.

자바
InstantiatingGrpcChannelProvider channelProvider =
        DatastoreSettings.defaultGrpcTransportProviderBuilder()
                .setChannelPoolSettings(
                       ChannelPoolSettings.builder()
                                .setInitialChannelCount(MIN_VAL)
                                .setMaxChannelCount(MAX_VAL)
                                .build())
                .build();

DatastoreOptions options = DatastoreOptions.newBuilder()
         .setProjectId("my-project")
         .setChannelProvider(channelProvider)
         .setTransportOptions(GrpcTransportOptions.newBuilder().build())
         .build();

다음 단계

연결 풀 및 성능 권장사항에 대한 자세한 내용은 다음을 참고하세요.