簡體   English   中英

Astyanax客戶端中的setMaxConns和setMaxConnsPerHost

[英]setMaxConns and setMaxConnsPerHost in Astyanax client

我正在使用Astyanax clientCassandra database讀取數據。 我有一個包含four nodes single cluster 我的replication factor of 2 我試圖了解兩者之間的區別

setMaxConns and setMaxConnsPerHost 

客戶端中的方法? 我找不到關於此的適當文檔。

我有一個多線程代碼,該代碼產生多個線程,然后僅一次創建與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類。 我在同一個類中放置了很多斷點,以了解它如何使用連接和其他默認參數。 但是不知道為什么它沒有達到那個水平。

有關這些配置屬性的行為可能取決於實現。

BagOfConnectionsConnectionPoolImpl

BagOfConnectionsConnectionPoolImpl是目前唯一實現這兩個屬性的實現。 它的行為如下:

在每個cassandra操作(查詢或突變)中,連接都是從池中借用的,並在操作完成后返回到池中。

maxConnsPerHost每個單個cassandra主機的最大連接數。

maxConns池中的最大連接數。

這兩個數字都必須為正數,因此setMaxConns(-1)無效。

嘗試從池借用連接時,池會根據maxConns檢查活動的連接號。 如果超出限制,它將等待直到釋放某些連接。 如果在指定的超時時間內沒有可用的連接,則池將引發PoolTimeoutException

如果未超過maxConns限制,則池將嘗試查找其知道的(指定為種子或在發現過程中找到的)cassandra主機,該主機的活動連接數低於maxConnsPerHost並連接到該主機。 如果所有主機都達到連接限制,則池將引發NoAvailableHostsException

例如,讓我們以一個連接到4個節點的集群的客戶端為例:

setMaxConns(100); setMaxConnsPerHost(10) setMaxConns(100); setMaxConnsPerHost(10) :有效的最大連接數為40(每個節點10個連接,將不再嘗試連接)。 將引發NoAvailableHostsException

setMaxConns(20); setMaxConnsPerHost(10) setMaxConns(20); setMaxConnsPerHost(10) :有效的最大連接數為20。連接到不同主機的連接將均勻分布,但不必相等。 PoolTimeoutException將被拋出。

如果節點加入或離開群集,事情會變得更加復雜,但是總體思路是相同的。

TokenAwareConnectionPoolImpl和RoundRobinConnectionPoolImpl

TokenAwareConnectionPoolImplRoundRobinConnectionPoolImpl忽略maxConns配置屬性。 他們只是選擇一個主機(取決於行令牌或隨機選擇)並嘗試連接到它。

如果與該主機的活動連接數超過maxConnsPerHost ,則池將等待直到釋放某些連接。 如果在指定的超時時間內沒有可用的連接,則作為故障轉移的一部分,將執行(可能)與另一台主機的另一連接嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM