Cassandra – 有没有办法限制异步查询的数量?

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

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

... PreparedStatement stmt = session.prepare("SELECT * FROM users WHERE id = ?"); BoundStatement boundStatement = new BoundStatement(stmt); List futures = Lists.newArrayListWithExpectedSize(list.length); for(String id : list ) { futures.add(session.executeAsync(boundStatement.bind(id))); } for (ListenableFuture future : futures) { ResultSet rs = future.get(); ... // do some stuff } 

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

谢谢。

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

 final Semaphore semaphore = new Semaphore(numberOfConcurrentQueries); ... semaphore.acquire(); try { ResultSetFuture future = session.executeAsync("..."); Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(ResultSet result) { semaphore.release(); } @Override public void onFailure(Throwable t) { semaphore.release(); } }); } catch (Exception e) { semaphore.release(); } 

但是在一天结束时它并没有那么不同:当你超过容量时,不会获得NoHostAvailableException ,信号量将阻塞(或者如果你使用获取的定时版本则抛出)。 因此,您可能希望将背压应用于触发这些查询的组件。

您可能还想调整连接池以调整容量,请参阅我们的文档 (适用于2.1,如果您使用的是2.0,则使用页面顶部的下拉列表)。

Interesting Posts