java - Astyanax 客户端中的 setMaxConns 和 setMaxConnsPerHost

标签 java cassandra astyanax

我正在使用 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/

相关文章:

Cassandra - 磁盘空间不足

cassandra - token 感知 Astyanax 连接池在节点上连接而不在节点上分配连接

java - Astyanax Cassandra 客户端中的连接池类型

cassandra - 从 Cassandra 服务器读取列族列表

java - 如何从客户端简单地将对象添加到 hibernate 中的集合

java - PaintComponent 从未被调用

Java 文本属性文件 : is there any way to test validity?

java - 使用 DataStax Java 驱动程序 1.0.4 通过 CQL 连接到 Cassandra 时出现异常

java - 检查 readLine 是否为空,但不读取一行

scala - SpringDataForCassandra : NullPointerEx in Entity when an Int column is set null in DB