

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 最佳化無伺服器環境的用戶端驅動程式連線
<a name="connections"></a>

若要與 Amazon Keyspaces 通訊，您可以使用您選擇的任何現有 Apache Cassandra 用戶端驅動程式。由於 Amazon Keyspaces 是無伺服器服務，我們建議您最佳化用戶端驅動程式的連線組態，以滿足應用程式的輸送量需求。本主題介紹最佳實務，包括如何計算應用程式需要多少連線，以及監控和錯誤處理連線。

**Topics**
+ [連線在 Amazon Keyspaces 中的運作方式](#connections.howtheywork)
+ [如何在 Amazon Keyspaces 中設定連線](#connections.howtoconfigure)
+ [如何在 Amazon Keyspaces 中設定連線的重試政策](#connections.retry-policies)
+ [如何在 Amazon Keyspaces 中透過 VPC 端點設定連線](#connections.VPCendpoints)
+ [如何在 Amazon Keyspaces 中監控連線](#connections.howtomonitor)
+ [如何處理 Amazon Keyspaces 中的連線錯誤](#connections.errorhandling)

## 連線在 Amazon Keyspaces 中的運作方式
<a name="connections.howtheywork"></a>

本節概述用戶端驅動程式連線如何在 Amazon Keyspaces 中運作。由於 Cassandra 用戶端驅動程式設定錯誤可能會導致 Amazon Keyspaces 中的`PerConnectionRequestExceeded`事件，因此需要在用戶端驅動程式組態中設定正確數量的連線，以避免這些和類似的連線錯誤。

連線至 Amazon Keyspaces 時，驅動程式需要種子端點才能建立初始連線。Amazon Keyspaces 使用 DNS 將初始連線路由到許多可用端點之一。端點會連接到網路負載平衡器，進而建立與機群中其中一個請求處理常式的連線。建立初始連線後，用戶端驅動程式會從`system.peers`資料表收集所有可用端點的相關資訊。透過此資訊，用戶端驅動程式可以建立與所列端點的額外連線。用戶端驅動程式可以建立的連線數目會受限於用戶端驅動程式設定中指定的本機連線數目。根據預設，大多數用戶端驅動程式會為每個端點建立一個連線，並建立連至 Cassandra 的連線集區，以及透過該連線集區的負載平衡查詢。雖然可以建立與相同端點的多個連線，但在網路負載平衡器後方，它們可能會連接到許多不同的請求處理常式。透過公有端點連線時，建立與`system.peers`資料表中所列九個端點的連線，會產生與不同請求處理常式的九個連線。

![\[圖表顯示驅動程式建立的連線如何先到達 Amazon Keyspaces 服務的端點，然後繼續到負載平衡器，並在驗證和授權後，CQL 請求到達儲存層。\]](http://docs.aws.amazon.com/zh_tw/keyspaces/latest/devguide/images/keyspaces_bp-connections.png)


## 如何在 Amazon Keyspaces 中設定連線
<a name="connections.howtoconfigure"></a>

Amazon Keyspaces 每秒支援每個 TCP 連線最多 3，000 個 CQL 查詢。由於驅動程式可以建立的連線數目沒有限制，因此我們建議**每個連線每秒只鎖定 500 個 CQL 請求**，以允許額外負荷、流量爆增和更好的負載平衡。請遵循下列步驟，以確保您驅動程式的連線已針對應用程式的需求正確設定。

**增加驅動程式在其連線集區中維護的每個 IP 地址的連線數量。**
+ 大多數 Cassandra 驅動程式會建立連至 Cassandra 的連線集區，並針對該連線集區進行負載平衡查詢。大多數驅動程式的預設行為是建立與每個端點的單一連線。Amazon Keyspaces 向驅動程式公開九個對等 IP 地址，因此根據大多數驅動程式的預設行為，這會產生 9 個連線。Amazon Keyspaces 每秒支援每個 TCP 連線最多 3，000 個 CQL 查詢，因此使用預設設定的驅動程式 CQL 查詢輸送量上限為每秒 27，000 個 CQL 查詢。如果您使用驅動程式的預設設定，則單一連線可能必須處理超過每秒 3，000 個 CQL 查詢的最大 CQL 查詢輸送量。這可能會導致`PerConnectionRequestExceeded`事件。
+ 若要避免`PerConnectionRequestExceeded`事件，您必須設定驅動程式為每個端點建立額外的連線，以分配輸送量。
+ 作為 Amazon Keyspaces 的最佳實務，假設每個連線每秒可以支援 **500 個 CQL 查詢**。
+ 這表示對於需要支援分佈在九個可用端點上每秒 27，000 個 CQL 查詢的生產應用程式，您必須為每個端點設定六個連線。這可確保每個連線每秒處理不超過 500 個請求。

**根據應用程式的需求，計算您需要為驅動程式設定的每個 IP 地址的連線數。**

若要判斷應用程式每個端點需要設定的連線數，請考慮下列範例。您有一個應用程式需要支援每秒 20，000 個 CQL 查詢，其中包含 10，000`INSERT`、5，000 `SELECT`和 5，000 個`DELETE`操作。Java 應用程式正在 Amazon Elastic Container Service (Amazon ECS) 上的三個執行個體上執行，其中每個執行個體都會建立 Amazon Keyspaces 的單一工作階段。您可以使用 計算來估計您需要為驅動程式設定多少連線使用以下輸入。

1. 您的應用程式需要支援的每秒請求數。

1. 將可用執行個體的數量減去一個執行個體，以考慮維護或故障。

1. 可用端點的數量。如果您要透過公有端點連線，您有九個可用的端點。如果您使用的是 VPC 端點，則視區域而定，您有兩到五個可用的端點。

1. 使用每個連線每秒 500 個 CQL 查詢做為 Amazon Keyspaces 的最佳實務。

1. 將結果四捨五入。

在此範例中，公式如下所示。

```
20,000 CQL queries / (3 instances - 1 failure) / 9 public endpoints / 500 CQL queries per second = ROUND(2.22) = 3 
```

根據此計算，您需要在驅動程式組態中為每個端點指定三個本機連線。對於遠端連線，每個端點只能設定一個連線。

## 如何在 Amazon Keyspaces 中設定連線的重試政策
<a name="connections.retry-policies"></a>

設定 Amazon Keyspaces 連線的重試政策時，建議您實作 Amazon Keyspaces 重試政策 `AmazonKeyspacesExponentialRetryPolicy`。此重試政策更適合在與驅動程式 不同的 Amazon Keyspaces 連線之間重試`DefaultRetryPolicy`。

使用 `AmazonKeyspacesExponentialRetryPolicy`，您可以為符合您需求的連線設定重試嘗試次數。根據預設， 的重試嘗試次數`AmazonKeyspacesExponentialRetryPolicy`設定為 3。

另一個優點是 Amazon Keyspaces 重試政策會傳回 服務傳回的原始例外狀況，這表示請求嘗試失敗的原因。預設重試政策只會傳回一般 `NoHostAvailableException`，這可能會隱藏對請求失敗的洞察。

若要使用 設定請求重試政策`AmazonKeyspacesExponentialRetryPolicy`，建議您設定少量重試，並處理應用程式程式碼中傳回的任何例外狀況。

 如需實作重試政策的程式碼範例，請參閱 Github 上的 [Amazon Keyspaces 重試政策](https://github.com/aws-samples/amazon-keyspaces-java-driver-helpers/tree/main/src/main/java/com/aws/ssa/keyspaces/retry)。

## 如何在 Amazon Keyspaces 中透過 VPC 端點設定連線
<a name="connections.VPCendpoints"></a>

透過私有 VPC 端點連線時，您很可能有 3 個端點可用。每個區域的 VPC 端點數量可以不同，取決於可用區域的數量，以及指派的 VPC 中的子網路數量。美國東部 （維吉尼亞北部） 區域有五個可用區域，您最多可以有五個 Amazon Keyspaces 端點。美國西部 （加利佛尼亞北部） 區域有兩個可用區域，您最多可以有兩個 Amazon Keyspaces 端點。端點數量不會影響擴展，但確實會增加您需要在驅動程式組態中建立的連線數量。請考量下列範例。您的應用程式需要支援 20，000 個 CQL 查詢，並在 Amazon ECS 上的三個執行個體上執行，其中每個執行個體都會建立 Amazon Keyspaces 的單一工作階段。唯一的差別是不同 中有多少個端點可用 AWS 區域。

美國東部 （維吉尼亞北部） 區域所需的連線：

```
20,000 CQL queries / (3 instances - 1 failure) / 5 private VPC endpoints / 500 CQL queries per second = 4 local connections
```

美國西部 （加利佛尼亞北部） 區域所需的連線：

```
20,000 CQL queries / (3 instances - 1 failure) / 2 private VPC endpoints / 500 CQL queries per second = 10 local connections
```

**重要**  
使用私有 VPC 端點時，Amazon Keyspaces 需要額外的許可，才能動態探索可用的 VPC 端點並填入`system.peers`資料表。如需詳細資訊，請參閱[使用界面 VPC 端點資訊填入`system.peers`資料表項目](vpc-endpoints.md#system_peers)。

 使用不同的私有 VPC 端點存取 Amazon Keyspaces 時 AWS 帳戶，您可能只會看到單一 Amazon Keyspaces 端點。同樣地，這不會影響 Amazon Keyspaces 可能輸送量的規模，但可能需要增加驅動程式組態中的連線數。此範例顯示單一可用端點的相同計算。

```
20,000 CQL queries / (3 instances - 1 failure) / 1 private VPC endpoints / 500 CQL queries per second = 20 local connections
```

若要進一步了解如何使用共用 VPC 跨帳戶存取 Amazon Keyspaces，請參閱 [使用共用 VPC 中的 VPC 端點設定 Amazon Keyspaces 的跨帳戶存取權](access.cross-account.sharedVPC.md)。

## 如何在 Amazon Keyspaces 中監控連線
<a name="connections.howtomonitor"></a>

為了協助識別應用程式連線的端點數量，您可以記錄`system.peers`資料表中探索的對等數目。下列範例是 Java 程式碼的範例，其會在建立連線後列印對等數目。

```
ResultSet result = session.execute(new SimpleStatement("SELECT * FROM system.peers"));

logger.info("number of Amazon Keyspaces endpoints:" + result.all().stream().count());
```

**注意**  
CQL 主控台或 AWS 主控台不會部署在 VPC 內，因此會使用公有端點。因此，從位於 VPCE 外部的應用程式執行`system.peers`查詢通常會產生 9 個對等。列印每個對等的 IP 地址也很有幫助。

您也可以設定 VPCE Amazon CloudWatch 指標，觀察使用 VPC 端點時的對等數量。在 CloudWatch 中，您可以查看與 VPC 端點建立的連線數。Cassandra 驅動程式會為每個端點建立連線，以傳送 CQL 查詢和控制連線，以收集系統資料表資訊。下圖顯示透過驅動程式設定中設定的 1 個連線連線至 Amazon Keyspaces 後的 VPC 端點 CloudWatch 指標。指標顯示六個作用中連線，其中包含一個控制連線和五個連線 （跨可用區域的每個端點 1 個）。

![\[螢幕擷取畫面，顯示 Cloudwatch 儀表板上經過 VPC 端點之連線的指標。使用的指標是 ActiveConnections 和 BytesProcessed。\]](http://docs.aws.amazon.com/zh_tw/keyspaces/latest/devguide/images/keyspaces_bp_cw.png)


若要開始使用 CloudWatch 圖形監控連線數量，您可以在 Amazon Keyspaces CloudFormation 範本儲存庫的 GitHub 上部署此範本。 [https://github.com/aws-samples/amazon-keyspaces-cloudwatch-cloudformation-templates](https://github.com/aws-samples/amazon-keyspaces-cloudwatch-cloudformation-templates)

## 如何處理 Amazon Keyspaces 中的連線錯誤
<a name="connections.errorhandling"></a>

超過每個連線配額 3，000 個請求時，Amazon Keyspaces 會傳回`PerConnectionRequestExceeded`事件，且 Cassandra 驅動程式會收到 `WriteTimeout`或 `ReadTimeout`例外狀況。您應該在 Cassandra 重試政策或應用程式中以指數退避重試此例外狀況。您應該提供指數退避，以避免傳送其他請求。

預設重試政策會嘗試查詢計畫`try next host`中的 。由於 Amazon Keyspaces 在連線至 VPC 端點時可能會有一到三個可用的端點，因此除了應用程式日誌中的 `WriteTimeout`和 `ReadTimeout`例外狀況`NoHostAvailableException`之外，您也可以看到 。您可以使用 Amazon Keyspaces 提供的重試政策，在相同的端點上重試，但在不同的連線之間重試。

您可以在 Amazon Keyspaces Java 程式碼範例儲存庫中找到 GitHub 上 Java 的指數重試政策範例。 [https://github.com/aws-samples/amazon-keyspaces-java-driver-helpers/blob/main/src/main/java/com/aws/ssa/keyspaces/retry/AmazonKeyspacesExponentialRetryPolicy.java](https://github.com/aws-samples/amazon-keyspaces-java-driver-helpers/blob/main/src/main/java/com/aws/ssa/keyspaces/retry/AmazonKeyspacesExponentialRetryPolicy.java)您可以在 [Amazon Keyspaces 程式碼範例儲存庫的 Github 上找到其他語言範例](https://github.com/aws-samples/amazon-keyspaces-examples)。