0

我正在同時運行超過50個線程的ExecutorService。每個線程打開與Cassandra的連接並使用springframework.data.cassandra執行插入。問題是,當我一次打開超過50個連接時,出現以下錯誤。Cassandra無法創建選擇器。多線程多個併發cassandra連接

Caused by: org.jboss.netty.channel.ChannelException: Failed to create a selector. 
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.openSelector(AbstractNioSelector.java:343) 
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.<init>(AbstractNioSelector.java:100) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.<init>(AbstractNioWorker.java:52) 
    at org.jboss.netty.channel.socket.nio.NioWorker.<init>(NioWorker.java:45) 
    at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:45) 
    at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:28) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.newWorker(AbstractNioWorkerPool.java:143) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.init(AbstractNioWorkerPool.java:81) 
    at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:39) 
    at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:33) 
    at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:151) 
    at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:116) 
    at com.datastax.driver.core.Connection$Factory.<init>(Connection.java:532) 
    at com.datastax.driver.core.Cluster$Manager.<init>(Cluster.java:1201) 
    at com.datastax.driver.core.Cluster$Manager.<init>(Cluster.java:1144) 
    at com.datastax.driver.core.Cluster.<init>(Cluster.java:121) 
    at com.datastax.driver.core.Cluster.<init>(Cluster.java:108) 
    at com.datastax.driver.core.Cluster.buildFrom(Cluster.java:177) 
    at com.datastax.driver.core.Cluster$Builder.build(Cluster.java:1109) 

如果我打開正好50個線程(或更少),它工作正常。有沒有辦法配置這個,所以我可以允許更多?在我的cassandra.yaml文件中,rpc_max_threads根據默認的評論「默認是無限的」

+0

它默認說這個數字是128 – user1738539

回答

1

我的猜測是你通過創建太多的連接壓倒你的操作系統。您應該只爲每個Cassandra羣集創建1個羣集實例。集羣創建會話,管理他們自己的連接池。集羣和會話都是線程安全的,因此您可以在線程之間共享它們。

Four simple rules for coding with the driver提煉這些概念很好:

當編寫使用的驅動程序代碼,有您應該遵循,也將讓你的代碼效率四個簡單的規則:

  1. 使用一個集羣每個(物理)羣集實例(每個應用程序生命週期)
  2. 每個密鑰空間至多使用一個會話實例,或者使用單個會話並在查詢中明確指定密鑰空間 ...

集羣實例允許配置連接和查詢處理方式的不同重要方面。在此級別,您可以配置接觸點(驅動程序執行節點發現之前最初聯繫的節點的地址),請求路由策略,重試和重新連接策略等等的所有內容。通常,這些設置在應用程序級別設置一次。

雖然會話實例以查詢執行爲中心,但會話也會管理每個節點的連接池。會話實例是一個長壽命的對象,不應該以請求 - 響應,短命的方式使用。代碼應該在應用程序中共享相同的集羣和會話實例。