astynax客户机中的setmaxconns和setmaxconnsperhost

nkhmeac6  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(364)

我正在使用 Astyanax client 从中读取数据 Cassandra database . 我有一个 single clusterfour nodes . 我正在吃 replication factor of 2 . 我在努力理解

setMaxConns and setMaxConnsPerHost

astyanax客户端中的方法?我找不到这方面的适当文件。
我有一个多线程代码,它生成多个线程,然后只创建一次到cassandra数据库的连接(因为它是一个单线程),然后继续为其他请求重用。
现在我想了解一下以上两种方法在阅读中的作用?这些值应该如何设置?
如果我把以上两种方法设置为-

setMaxConns(-1) and setMaxConnsPerHost(20)

那是什么意思?任何解释都会大有帮助。
更新code:-
下面是代码,我用它来建立连接-

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 班级。我在同一个类中放置了很多断点,以查看它是如何使用conenctions和其他默认参数的。但我不知道为什么它没有击中那个类。

q43xntqr

q43xntqr1#

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

bagofconnectionsconnectionpoolimpl BagOfConnectionsConnectionPoolImpl 是目前唯一一个同时满足这两个属性的实现。其行为如下:

每次cassandra操作(查询或变异)时,连接都从池中借用,并在操作完成时返回到池中。 maxConnsPerHost -每个cassandra主机的最大连接数。 maxConns -池中的最大连接数。
这两个数字都必须是正数,所以 setMaxConns(-1) 只是行不通。
在尝试从池借用连接时,池将根据 maxConns . 如果超出限制,它将等待某个连接被释放。如果在指定的超时时间内没有可用的连接,则池将抛出 PoolTimeoutException .
如果 maxConns 如果未超出限制,则池将尝试查找它所知道的具有以下活动连接数的cassandra主机(指定为种子或在发现期间找到) maxConnsPerHost 并连接到它。如果所有主机都达到连接限制,池将抛出 NoAvailableHostsException .
例如,让我们以一个连接到由4个节点组成的集群的客户机为例: setMaxConns(100); setMaxConnsPerHost(10) :有效最大连接数为40(每个节点10个连接,将不再尝试连接)。 NoAvailableHostsException 将被抛出。 setMaxConns(20); setMaxConnsPerHost(10) :有效最大连接数为20。到不同主机的连接将均匀分布,但不一定要均匀分布。 PoolTimeoutException 将被抛出。
如果节点加入或离开集群,事情会变得更复杂,但总体思路是一样的。

tokenawareconnectionpoolimpl和roundrobinconnectionpoolimpl

两者 TokenAwareConnectionPoolImpl & RoundRobinConnectionPoolImpl 忽略 maxConns 配置属性。他们只是选择一个主机(取决于行标记或随机)并尝试连接到它。
如果到该主机的活动连接数超过 maxConnsPerHost ,池将等待某个连接被释放。如果在指定的超时期间没有可用的连接,则会在故障转移过程中执行另一个到(可能)另一个主机的连接尝试。

相关问题