[英]setMaxConns and setMaxConnsPerHost in Astyanax client
我正在使用Astyanax client
從Cassandra 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
是目前唯一實現這兩個屬性的實現。 它的行為如下:
在每個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
忽略maxConns
配置屬性。 他們只是選擇一個主機(取決於行令牌或隨機選擇)並嘗試連接到它。
如果與該主機的活動連接數超過maxConnsPerHost
,則池將等待直到釋放某些連接。 如果在指定的超時時間內沒有可用的連接,則作為故障轉移的一部分,將執行(可能)與另一台主機的另一連接嘗試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.