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 和平均延遲時間,計算連線集區的最佳連線數,請按照下列步驟操作:
從用戶端指標收集下列資訊,並進行下列計算:
- 應用程式執行工作負載時,請判斷每個用戶端的每秒查詢次數上限 (QPS)。
- 以毫秒為單位,判斷平均延遲時間 (單一要求的處理時間)。
- 將 1,000 除以平均延遲值,即可判斷每秒可循序傳送的要求數。
- 將每秒 QPS 除以每秒連續要求數。
- 將結果除以每個管道 50 個要求,即可判斷最佳連線集區大小下限。(如果計算結果小於 2,請至少使用 2 個頻道,確保有備援機制)。
- 將相同結果除以每個管道 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();
後續步驟
如要進一步瞭解連線集區和效能最佳做法,請參閱: