Java MaxConnectionsPerHost vs MaxRequestsPerConnection Cassandra驱动程序

Java MaxConnectionsPerHost vs MaxRequestsPerConnection Cassandra驱动程序,java,performance,cassandra,bigdata,datastax-java-driver,Java,Performance,Cassandra,Bigdata,Datastax Java Driver,我正在处理C*的巨大查询集。我已经使用限制异步查询执行器 Semaphore maxInFlight = new Semaphore(MAX_REQUEST_PER_CON_REMOTE); ... maxInFlight.acquireUninterruptibly(); ResultSetFuture future = executeAsync(...); Futures.addCallback(future, new FutureCallback<ResultSet>() {

我正在处理C*的巨大查询集。我已经使用限制异步查询执行器

Semaphore maxInFlight = new Semaphore(MAX_REQUEST_PER_CON_REMOTE);
...
maxInFlight.acquireUninterruptibly();
ResultSetFuture future = executeAsync(...);
Futures.addCallback(future, new FutureCallback<ResultSet>() {
     @Override
     public void onSuccess(ResultSet rs) {
     ...
     maxInFlight.release();
     }

     @Override
     public void onFailure(Throwable t) {
     ...
     maxInFlight.release();
     }, executor);
Semaphore maxInFlight=新信号量(每个控制远程的最大请求);
...
maxInFlight.acquireUnterruptibly();
结果未来=执行同步(…);
Futures.addCallback(future,newfuturecallback(){
@凌驾
成功时公共无效(结果集rs){
...
maxInFlight.release();
}
@凌驾
失效时的公共无效(可丢弃的t){
...
maxInFlight.release();
},遗嘱执行人);
其中,MAX_REQUEST_PER_CON_REMOTE是MaxRequestsPerConnection参数。 默认情况下,MaxConnectionsPerHos等于1,我没有更改它

我相信,随着节点数量的增加或复制因子的增加,我可以增加MaxConnectionsPerHos或MaxRequestsPerConnection来提高生产效率。 增加这两个方面有什么好处吗


此外,我还想更改信号量的依赖关系,但实际上不知道如何更改。想法是在添加或删除主机时添加侦听器并更新maxInFlight。

如果您没有使用白名单或黑名单策略,则驱动程序将分别连接到每个主机(当然取决于配置,如果您使用的是DC感知策略)。因此,当您添加新节点时,驱动程序将向该节点添加一个新连接,并且负载将被重新分配(如果您的查询没有“热”分区)。如果您增加复制因子,那么这也没什么大不了的,因为向副本发送请求不是由驱动程序完成的,而是由“协调器”节点完成的

因此,当本地DC中有N个节点时,从理论上讲,最多可以发送
N*MaxInFlighConnections
请求(但这取决于请求中的数据分布)

另外,我看到您使用的是
MAX\u REQUEST\u PER\u CON\u REMOTE
——最好只将请求发送到本地DC的节点。此外,您还可以配置每个连接最多32k个请求,在大多数情况下,这对于一个客户端执行请求来说已经足够了

您可以在中找到更多信息


另外,我有一个与信号量使用相同的方法,但会自动添加侦听器-请随意获取它。

嗨,Alex。谢谢你的回答。在你在github上的代码中,我看到,你也通过常量限制请求的数量,但是,例如,如果一个主机宕机或可能添加了新主机,它不会改变。我相信有一个wa根据活动主机的数量、响应时间或smth等因素,动态更改。但事实上,我不知道它是否会提高性能。自动执行此操作确实是一个更大的问题,因为我们需要限制每个连接到特定主机的请求数,这取决于您网络中的数据分布集群和您的查询-可能是某些分区范围会比其他分区范围收到更多请求。在这种情况下,具有全局限制也会导致BusyPoolException…我与开发人员讨论过它-他们可能会在下一个主要版本的Java驱动程序中实现比我的代码更复杂的东西