Astyanax客户端中的setMaxConns和setMaxConnsPerHost

时间:2013-04-25 04:41:25

标签: java cassandra astyanax

我正在使用Astyanax client来阅读Cassandra database中的数据。我有single cluster four nodes。我有replication factor of 2。我试图了解

之间的区别
setMaxConns and setMaxConnsPerHost 
Astyanax客户端中的

方法?我找不到合适的文件。

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

现在我想了解上述两种方法如何在读取性能中发挥作用?以及如何设置这些值?

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

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

1 个答案:

答案 0 :(得分:4)

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

BagOfConnectionsConnectionPoolImpl

BagOfConnectionsConnectionPoolImpl是目前唯一能够尊重这两个属性的实现。它的行为如下:

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

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

maxConns - 池中的最大连接数。

这两个数字都必须是正数,所以setMaxConns(-1)才能胜任。

在尝试从池中借用连接时,池会检查与maxConns的活动连接号。如果超出限制,则等待直到某个连接被释放。如果在指定的超时时间内没有可用的连接,则池将抛出PoolTimeoutException

如果未超过maxConns限制,则池会尝试查找一个cassandra主机,它知道(在发现期间指定为种子或发现),其活动连接数低于{{1}并连接到它。如果所有主机都达到连接限制,则池将抛出maxConnsPerHost

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

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

NoAvailableHostsException:有效的最大连接数为20.与不同主机的连接将统一分配,但不一定必要。 setMaxConns(20); setMaxConnsPerHost(10)将被抛出。

如果节点加入或离开集群,事情变得更复杂,但总的想法是一样的。

TokenAwareConnectionPoolImpl& RoundRobinConnectionPoolImpl

PoolTimeoutException& TokenAwareConnectionPoolImpl忽略RoundRobinConnectionPoolImpl配置属性。他们只选择一个主机(取决于行令牌或随机)并尝试连接到它。

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