本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
步驟 6:(選擇性) 為應用程式設定連線集區大小的最佳作法
在本節中,我們概述如何根據應用程式的查詢輸送量需求判斷理想的連線集區大小。
Amazon Keyspaces 每個TCP連線每秒最多允許 3,000 個CQL查詢。因此,驅動程序可以使用 Amazon Keyspaces 建立的連接數量幾乎沒有限制。不過,我們建議您將連線集區大小與應用程式的需求相符,並在搭配端點連線使用 Amazon Keyspaces 時考量可用的VPC端點。
您可以在用戶端驅動程式中設定連線集區大小。例如,根據 2 的本機集區大小和跨 3 個可用區域建立的VPC介面端點,驅動程式會建立 6 個連線以進行查詢 (總共 7 個,其中包括控制連線)。使用這 6 個連線,您每秒最多可支援 18,000 個CQL查詢。
如果您的應用程式每秒需要支援 40,000 個CQL查詢,請從判斷所需連線集區大小所需的查詢數量倒退。若要每秒支援 40,000 個CQL查詢,您需要將本機集區大小設定為至少 5 個,每秒至少支援 45,000 個CQL查詢。
您可以使用AWS/Cassandra
命名空間中的PerConnectionRequestRateExceeded
CloudWatch測量結果來監督是否超過每秒每個連線的作業數目上限配額。該PerConnectionRequestRateExceeded
指標顯示超出每個連線請求率配額的 Amazon Keyspaces 的請求數目。
此步驟中的程式碼範例顯示如何在使用介面VPC端點時估計和設定連線集區。
- Java
-
您可以在 Java 驅動程式中設定每個集區的連線數目。有關 Java 客戶端驅動程序連接的完整實例,敬請參閱使用卡桑德拉 Java 客戶端驅動程序以編程方式訪問 Amazon Keyspaces。
當用戶端驅動程式啟動時,會先建立管理工作的控制連線,例如結構描述和拓撲變更。然後創建其他連接。
在下列範例中,本機集區大小驅動程式組態指定為 2。如果VPC端點是跨越中的 3 個子網路建立的VPC,則介面端點會產生 7 NewConnections
in CloudWatch ,如下列公式所示。
NewConnections = 3 (VPC subnet endpoints created across) * 2 (pool size) + 1 ( control connection)
datastax-java-driver {
basic.contact-points = [ "cassandra.us-east-1.amazonaws.com:9142"]
advanced.auth-provider{
class = PlainTextAuthProvider
username = "ServiceUserName
"
password = "ServicePassword
"
}
basic.load-balancing-policy {
local-datacenter = "us-east-1"
slow-replica-avoidance = false
}
advanced.ssl-engine-factory {
class = DefaultSslEngineFactory
truststore-path = "./src/main/resources/cassandra_truststore.jks"
truststore-password = "my_password"
hostname-validation = false
}
advanced.connection {
pool.local.size = 2
}
}
如果活動連接的數量與配置的池大小(跨子網絡的聚合)+ 1 個控制連接不匹配,則有些東西阻止了連接被創建。
- Node.js
-
您可以在 Node.js 驅動程式中設定每個集區的連線數目。如需 Node.js 用戶端驅動程式連線的完整範例,請參閱使用卡桑德拉 Node.js 客戶端驅動程序以編程方式訪問 Amazon Keyspaces。
對於下列程式碼範例,本機集區大小驅動程式組態會指定為 1。如果VPC端點是跨 4 個子網路建立的VPC,則介面端點會產生 5 NewConnections
in CloudWatch ,如下列公式所示。
NewConnections = 4 (VPC subnet endpoints created across) * 1 (pool size) + 1 ( control connection)
const cassandra = require('cassandra-driver');
const fs = require('fs');
const types = cassandra.types;
const auth = new cassandra.auth.PlainTextAuthProvider('ServiceUserName', 'ServicePassword');
const sslOptions1 = {
ca: [
fs.readFileSync('/home/ec2-user/sf-class2-root.crt', 'utf-8')],
host: 'cassandra.us-east-1.amazonaws.com',
rejectUnauthorized: true
};
const client = new cassandra.Client({
contactPoints: ['cassandra.us-east-1.amazonaws.com'],
localDataCenter: 'us-east-1',
pooling: { coreConnectionsPerHost: { [types.distance.local]: 1 } },
consistency: types.consistencies.localQuorum,
queryOptions: { isIdempotent: true },
authProvider: auth,
sslOptions: sslOptions1,
protocolOptions: { port: 9142 }
});