設定連線集區

部分 Cloud Bigtable 用戶端程式庫可讓您設定用戶端連線集區中的 gRPC 管道數量,也就是管道集區。在大多數情況下,預設設定都是正確的,因此不需要變更。

使用 Java 適用的 Cloud Bigtable 用戶端程式庫 2.23.0 以上版本,以及 Java 適用的 Cloud Bigtable HBase 用戶端 2.9.1 以上版本時,連線集區會視需要自動調整大小。

本頁說明如何為應用程式判斷最佳連線集區大小,並提供程式碼片段,說明如何設定連線集區。

閱讀本頁面之前,請先參閱 Bigtable 連線集區總覽,瞭解連線集區的運作方式,以及是否應變更連線集區。

下列用戶端程式庫提供連線集區功能,可讓您設定集區數量:

判斷最佳連線集區大小

理想情況下,為了預留流量波動空間,連線集區的連線數量約為達到飽和狀態所需連線數的兩倍。由於每個連線最多可處理 100 個並行要求,因此每個連線的待處理要求數介於 10 到 50 個之間最為理想。如要進一步瞭解這個概念,請參閱「連線集區」。

變更後請監控流量,並視需要調整集區中的連線數。

下列步驟有助於使用用戶端指標 (例如 OpenCensus 提供的指標),計算管道集區的最佳連線數。

  1. 從用戶端指標收集下列資訊:
    1. 應用程式執行一般工作負載時,每個用戶端每秒可執行的查詢數上限 (QPS)。
    2. 以毫秒為單位的平均延遲時間 (單一要求的回應時間)。
  2. 將 1,000 除以平均延遲值,即可判斷每秒可連續傳送的要求數。
  3. 將每秒 QPS 除以每秒連續要求數。
  4. 將結果除以每個管道 50 項要求,即可判斷最佳管道集區大小下限。(如果計算結果小於 2,請至少使用 2 個頻道,確保有備援機制)。
  5. 將相同結果除以每個管道 10 個要求,即可判斷最佳管道集區大小上限。

這些步驟可表示為下列方程式:

  • (每秒查詢次數 ÷ (1,000 ÷ 延遲時間 (毫秒))) ÷ 50 個串流 = 最佳連線數下限

  • (每秒查詢次數 ÷ (1,000 ÷ 延遲時間 (毫秒))) ÷ 10 個串流 = 最佳連線數量上限

範例

您的應用程式通常每秒會傳送 50,000 個要求,平均延遲時間為 10 毫秒。將 1,000 除以 10 毫秒,即可判斷每秒可連續傳送 100 個要求。將該數字除以 50,000,即可得出傳送 50,000 QPS 時所需的平行處理量:500。每個頻道最多可同時發出 100 個要求,目標頻道使用率介於 10 到 50 個並行串流之間。因此,如要計算最小值,請將 500 除以 50,得出 10。如要找出上限,請將 500 除以 10,得出 50。也就是說,這個範例的管道集區大小應介於 10 到 50 個連線之間。

設定泳池長度

下列程式碼範例示範如何在用戶端程式庫中設定集區數量,以便設定集區大小。

Go

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigtable"
	"google.golang.org/api/option"
)

func configureConnectionPool(w io.Writer, projectID, instanceID string) error {
	// projectID := "my-project-id"
	// instanceID := "my-instance-id"
	ctx := context.Background()

	// Set up Bigtable data operations client.
	poolSize := 10
	client, err := bigtable.NewClient(ctx, projectID, instanceID, option.WithGRPCConnectionPool(poolSize))
	defer client.Close()

	if err != nil {
		return fmt.Errorf("bigtable.NewClient: %w", err)
	}

	fmt.Fprintf(w, "Connected with pool size of %d", poolSize)

	return nil
}

HBase

這個範例僅適用於 2.9.1 之前的用戶端程式庫版本,因為自動調整大小功能是在 2.9.1 版推出。



import static com.google.cloud.bigtable.hbase.BigtableOptionsFactory.BIGTABLE_DATA_CHANNEL_COUNT_KEY;

import com.google.cloud.bigtable.hbase.BigtableConfiguration;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Connection;

public class ConfigureConnectionPool {

  public static void configureConnectionPool(String projectId, String instanceId) {
    // String projectId = "my-project-id";
    // String instanceId = "my-instance-id";
    Configuration config = BigtableConfiguration.configure(projectId, instanceId);
    config.setInt(BIGTABLE_DATA_CHANNEL_COUNT_KEY, 10);
    try (Connection connection = BigtableConfiguration.connect(config)) {
      int poolSize = connection.getConfiguration().getInt(BIGTABLE_DATA_CHANNEL_COUNT_KEY, 0);

      System.out.println(String.format("Connected with pool size of %d", poolSize));
    } catch (Exception e) {
      System.out.println("Error during ConfigureConnectionPool: \n" + e.toString());
    }
  }
}

Java

這個範例僅適用於 2.23.0 之前的用戶端程式庫版本,因為自動調整大小功能是在 2.23.0 版推出。


import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.BigtableDataSettings;
import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStubSettings;
import java.io.IOException;

public class ConfigureConnectionPool {

  public static void configureConnectionPool(String projectId, String instanceId) {
    // String projectId = "my-project-id";
    // String instanceId = "my-instance-id";

    BigtableDataSettings.Builder settingsBuilder =
        BigtableDataSettings.newBuilder().setProjectId(projectId).setInstanceId(instanceId);

    settingsBuilder
        .stubSettings()
        .setTransportChannelProvider(
            EnhancedBigtableStubSettings.defaultGrpcTransportProviderBuilder()
                .setPoolSize(10)
                .build());

    BigtableDataSettings settings = settingsBuilder.build();
    try (BigtableDataClient dataClient = BigtableDataClient.create(settings)) {
      InstantiatingGrpcChannelProvider provider =
          (InstantiatingGrpcChannelProvider)
              settings.getStubSettings().getTransportChannelProvider();

      int poolSize = provider.toBuilder().getPoolSize();

      System.out.println(String.format("Connected with pool size of %d", poolSize));
    } catch (IOException e) {
      System.out.println("Error during ConfigureConnectionPool: \n" + e.toString());
    }
  }
}

C++

namespace cbt = ::google::cloud::bigtable;
namespace gc = ::google::cloud;
[](std::string const& project_id, std::string const& instance_id,
   std::string const& table_id) {
  auto constexpr kPoolSize = 10;
  auto options = gc::Options{}.set<gc::GrpcNumChannelsOption>(kPoolSize);
  cbt::Table table(cbt::MakeDataConnection(options),
                   cbt::TableResource(project_id, instance_id, table_id));
  std::cout << "Connected with channel pool size of " << kPoolSize << "\n";
}