【问题标题】:Cassandra - Is there a way to limit number of async queries?Cassandra - 有没有办法限制异步查询的数量?
【发布时间】:2015-08-11 02:39:52
【问题描述】:

我想知道是否有办法限制 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


    【解决方案1】:

    您可以使用信号量来限制并发查询的数量:

    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,而是会阻塞(或者如果您使用定时版本的获取,则会抛出)。因此,您可能还想对触发这些查询的组件应用背压。

    您可能还想调整连接池以调整容量,请参阅our docs(适用于 2.1,如果您使用的是 2.0,请使用页面顶部的下拉菜单)。

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多