gpt4 book ai didi

java - Astyanax 客户端中的 setMaxConns 和 setMaxConnsPerHost

转载 作者:行者123 更新时间:2023-12-01 18:49:53 25 4
gpt4 key购买 nike

我正在使用 Astyanax 客户端Cassandra 数据库 读取数据。我有一个带有四个节点单集群。我的复制因子为 2。我试图了解两者之间的区别

setMaxConns and setMaxConnsPerHost 

Astyanax 客户端中的方法?我找不到这方面的正确文档。

我有一个多线程代码,它生成多个线程,然后仅创建一次与 Cassandra 数据库的连接(因为它是单例),然后继续重用其他请求。

现在我想了解一下上述两种方法对于读取性能将如何发挥作用?以及应该如何设置这些值?

如果我将上述两种方法设置为-

setMaxConns(-1) and setMaxConnsPerHost(20) 

那么这是什么意思呢?任何解释都会有很大帮助。

更新的代码:-

下面是我用来建立连接的代码-

private CassandraAstyanaxConnection() {

context = new AstyanaxContext.Builder()
.forCluster(ModelConstants.CLUSTER)
.forKeyspace(ModelConstants.KEYSPACE)
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
)
.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9160)
.setMaxConnsPerHost(20)
.setMaxConns(-1)
.setSeeds("host1:9160,host2:9160,host3:9160,host4:9160")
)
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setCqlVersion("3.0.0")
.setTargetCassandraVersion("1.2"))
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());

context.start();
keyspace = context.getEntity();

emp_cf = ColumnFamily.newColumnFamily(
ModelConstants.COLUMN_FAMILY,
StringSerializer.get(),
StringSerializer.get());
}

如果我正在调试此代码,它甚至不会命中 BagOfConnectionsConnectionPoolImpl 类。我在同一个类中放置了很多断点,以查看它如何使用连接和其他默认参数。但不知道为什么它没有达到该级别。

最佳答案

有关这些配置属性的行为可能取决于实现。

BagOfConnectionsConnectionPoolImpl

BagOfConnectionsConnectionPoolImpl 是目前唯一支持这两个属性的实现。其行为如下:

每次 cassandra 操作(查询或突变)时都会从池中借用连接,并在操作完成后返回到池中。

maxConnsPerHost - 每个 cassandra 主机的最大连接数。

maxConns - 池中的最大连接数。

这两个数字都必须为正数,因此 setMaxConns(-1) 不起作用。

在尝试从池中借用连接时,池会根据 maxConns 检查 Activity 连接数。如果超出限制,它将等待直到释放某些连接。如果在指定的超时时间内没有可用的连接,池将抛出 PoolTimeoutException

如果未超过 maxConns 限制,池会尝试查找它知道的(指定为种子或在发现过程中找到的) Activity 连接数低于 maxConnsPerHost< 的 cassandra 主机 并连接到它。如果所有主机达到连接限制,池将抛出 NoAvailableHostsException

例如,让我们以连接到 4 个节点的集群的客户端为例:

setMaxConns(100); setMaxConnsPerHost(10):有效最大连接数为40(每个节点10个连接,不会再进行连接尝试)。将抛出 NoAvailableHostsException

setMaxConns(20); setMaxConnsPerHost(10):有效最大连接数为20。不同主机的连接会均匀分布,但不一定均等。将抛出PoolTimeoutException

如果节点加入或离开集群,事情会变得更加复杂,但总体思路是相同的。

TokenAwareConnectionPoolImpl 和 RoundRobinConnectionPoolImpl

TokenAwareConnectionPoolImpl 和 RoundRobinConnectionPoolImpl 都忽略 maxConns 配置属性。他们只是选择一个主机(取决于行 token 或随机)并尝试连接到它。

如果该主机的 Activity 连接数超过 maxConnsPerHost,池将等待直到释放某些连接。如果在指定的超时时间内没有可用的连接,则作为故障转移的一部分,将执行(可能)另一台主机的另一次连接尝试。

关于java - Astyanax 客户端中的 setMaxConns 和 setMaxConnsPerHost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16206515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com