Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
步骤 6:(可选)为应用程序配置连接池大小的最佳实践
在本节中,我们将概述如何根据应用程序的查询吞吐量要求确定理想的连接池大小。
Amazon Keyspaces 每个 TCP 连接每秒最多允许 3,000 个 CQL 查询。因此,驾驶员可以与 Amazon Keyspaces 建立的连接数量几乎没有限制。但是,我们建议您将连接池大小与应用程序的要求相匹配,并在使用 Amazon Keyspaces 和 VPC 终端节点连接时考虑可用的终端节点。
您可以在客户机驱动程序中配置连接池的大小。例如,基于本地池的大小为2以及跨创建的 VPC 接口终端节点3可用区,驱动程序建立6用于查询的连接(总共 7 个,包括一个控制连接)。使用这 6 个连接,您每秒最多可以支持 18,000 个 CQL 查询。
如果您的应用程序需要支持每秒 40,000 个 CQL 查询,请从确定所需连接池大小所需的查询数量向后移动。要支持每秒 40,000 个 CQL 查询,您需要将本地池大小配置为至少 5,这样每秒至少支持 45,000 个 CQL 查询。
您可以使用以下方法监控每个连接是否超过了每秒最大操作数的配额PerConnectionRequestRateExceeded
CloudWatch中的指标Amazon/Cassandra
命名空间。的PerConnectionRequestRateExceeded
指标显示了向 Amazon Keyspaces 发出的超出每个连接请求速率配额的请求数量。
此步骤中的代码示例显示了在使用接口 VPC 终端节点时如何估算和配置连接池。
- Java
-
您可以在 Java 驱动程序中配置每个池的连接数。有关 Java 客户端驱动程序连接的完整示例,请参见使用 Cassandra Java 客户端驱动程序以编程方式访问亚马逊Keyspaces。
启动客户端驱动程序后,首先为管理任务(例如架构和拓扑更改)建立控制连接。然后创建其他连接。
在以下示例中,将本地池大小驱动程序配置指定为 2。如果 VPC 终端节点是在 VPC 内的 3 个子网中创建的,则结果是 7NewConnections
在 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 客户端驱动程序连接的完整示例,请参见使用 Cassandra Node.js 客户端驱动程序以编程方式访问亚马逊 Keyspaces。
在以下代码示例中,本地池大小驱动程序配置指定为 1。如果在 VPC 内的 4 个子网中创建 VPC 终端节点,则会产生 5 个NewConnections
在 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 }
});