Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
步骤 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查询。
您可以使用Amazon/Cassandra
命名空间中的PerConnectionRequestRateExceeded
CloudWatch指标来监控是否超过每个连接每秒最大操作数的配额。PerConnectionRequestRateExceeded
指标可以显示向 Amazon Keyspaces 发出的、超出每连接请求速率限额的请求数量。
此步骤中的代码示例显示了在使用接口VPC端点时如何估计和配置连接池。
- Java
-
您可以在 Java 驱动程序中配置每个池的连接数。有关 Java 客户端驱动程序连接的完整示例,请参阅使用 Cassandra 客户端驱动程序以编程方式访问 Amazon Keyspaces。
客户端驱动程序启动后,首先为管理任务(例如架构和拓扑更改)建立控制连接。然后创建其他连接。
在以下示例中,本地池大小驱动程序配置被指定为 2。如果VPC终端节点是在内的 3 个子网中创建的VPC,则接口终端节点将 CloudWatch 获得 7 NewConnections
英寸,如以下公式所示。
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 客户端驱动程序连接的完整示例,请参阅使用 Cassandra Node.js 客户端驱动程序以编程方式访问 Amazon Keyspaces。
在以下示例中,本地池大小驱动程序配置被指定为 1。如果VPC终端节点是在内的 4 个子网中创建的VPC,则接口终端节点将 CloudWatch 获得 5 NewConnections
英寸,如以下公式所示。
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 }
});