搭配 Java 用戶端程式庫使用 gRPC

Datastore 模式的 Java 用戶端提供 gRPC 做為傳輸層選項。使用 gRPC 連線集區可將 RPC 分散到多個連線,進而提升效能。

事前準備

安裝最新版本的 google-cloud-datastore 程式庫。

如何啟用 gRPC 傳輸行為

如要啟用 gRPC 傳輸行為,請將 setTransportOptions 新增至用戶端例項:

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

將傳輸選項明確設為 GrpcTransportOptions,可將用戶端設為在呼叫伺服器時使用 gRPC,而非 HTTP。

停用 gRPC 傳輸行為

如要停用 gRPC 傳輸行為,請還原為 HTTP 傳輸行為。如要這麼做,請移除 .setTransportOptions 程式碼行,或將 GrpcTransportOptions 替換為 HttpTransportOptions。您也必須重建並重新啟動應用程式。

Java
// 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 類型,請檢查傳輸選項類型:

Java
// Compares datastore transport options type

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

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

連線集區設定

連線集區 (又稱管道集區) 是資料庫連線的快取,用戶端會共用及重複使用這些連線,以縮短連線延遲時間並提升效能。如要提高應用程式效能,請設定連線集區。

本節說明如何判斷最佳連線集區大小,並示範如何在 Java 用戶端程式庫中設定連線集區大小。

判斷最佳連線集區大小

預設連線集區大小適用於大多數應用程式,在大多數情況下,不需要變更此設定。不過,如果輸送量過高或要求已緩衝處理,您可能需要變更連線集區大小。

理想情況下,為了預留流量波動空間,連線集區的連線數量約為達到飽和狀態所需連線數量的兩倍。由於連線最多可處理 100 個並行要求,因此建議每個連線有 10 到 50 個待處理要求。中介層會強制執行每個 gRPC 連線 100 個並行串流的限制,且這項限制無法設定。如要根據預估的每個用戶端 QPS 和平均延遲時間,計算連線集區的最佳連線數,請按照下列步驟操作:

從用戶端指標收集下列資訊,並進行下列計算:

  1. 應用程式執行工作負載時,請判斷每個用戶端的每秒查詢次數上限 (QPS)。
  2. 以毫秒為單位,判斷平均延遲時間 (單一要求的處理時間)。
  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 個要求。將該數字除以 50,000,即可得出傳送 50,000 QPS 時所需的平行處理:500。

每個管道最多可同時發出 100 個要求,目標管道用量介於 10 到 50 個並行串流之間。因此,如要計算連線集區大小下限,請將 500 除以 50,得到 10。如要找出連線集區大小上限,請將 500 除以 10,得出 50。

也就是說,本範例的連線集區大小介於 10 到 50 個連線之間。此外,進行這些變更後,請務必監控流量,並視需要調整集區中的連線數量。

設定泳池大小

下列程式碼範例說明如何使用 DatastoreOptions 在用戶端程式庫中設定連線集區。

Java
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();

後續步驟

如要進一步瞭解連線集區和效能最佳做法,請參閱: