Cassandra - 有没有办法限制异步查询的次数?

问题描述 投票:4回答:2

我想知道是否有办法限制cassandra java驱动同时执行的查询次数?

目前,我执行了很多查询,如下所示。

... 
PreparedStatement stmt = session.prepare("SELECT * FROM users WHERE id = ?");
BoundStatement boundStatement = new BoundStatement(stmt);
List<ResultSetFuture> futures = Lists.newArrayListWithExpectedSize(list.length);

for(String id : list ) {
     futures.add(session.executeAsync(boundStatement.bind(id)));
}

for (ListenableFuture<ResultSet> future : futures) {
ResultSet rs = future.get();
... // do some stuff
}

不幸的是,这可能导致NoHostAvailableException。

谢谢你。

java asynchronous cassandra-2.0 datastax
2个回答
11
投票

你可以使用semaphore来节制并发查询的数量。

final Semaphore semaphore = new Semaphore(numberOfConcurrentQueries);
...
semaphore.acquire();
try {
    ResultSetFuture future = session.executeAsync("...");
    Futures.addCallback(future, new FutureCallback<ResultSet>() {
        @Override
        public void onSuccess(ResultSet result) {
            semaphore.release();
        }

        @Override
        public void onFailure(Throwable t) {
            semaphore.release();
        }
    });
} catch (Exception e) {
    semaphore.release();
}

但到了最后,这并没有什么不同:与其得到一个 NoHostAvailableException 当你超过容量时,semaphore会阻塞(如果你使用定时版本的acquire,则会抛出)。所以你可能会想对触发这些查询的组件也施加背压。

你可能还想调整你的连接池来调整容量,请参见 我们的文件 (那是针对2.1的,如果你是2.0的,请使用页面顶部的下拉菜单)。

© www.soinside.com 2019 - 2024. All rights reserved.