cassandra、java和许多异步请求:这样好吗?

yks3o0rb  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(389)

我正在用cassandra和我的表开发一个java应用程序:

id  | registration | name 
 1          1         xxx
 1          2         xxx
 1          3         xxx
 2          1         xxx
 2          2         xxx
...        ...        ...
...        ...        ...
100,000    34        xxx

我的表有非常多的行(超过50000000行)。我有一个 myListIdsString id 迭代。我可以用:

SELECT * FROM table WHERE id IN (1,7,18, 34,...,)
//image more than 10,000,000 numbers in 'IN'

但这是一个糟糕的模式。因此,我使用异步请求的方式是:

List<ResultSetFuture> futures = new ArrayList<>();
    Map<String, ResultSetFuture> map = new HashMap<>();
   // map : key = id & value = data from Cassandra

    for (String id : myListIds)
    {
        ResultSetFuture resultSetFuture = session.executeAsync(statement.bind(id));
        mapFutures.put(id, resultSetFuture);
    }

然后我会用 getUninterruptibly() 方法。
这里是我的问题:我正在做可能超过10000000个casandra请求(每个'id'一个请求)。我把这些结果都放在Map上。
这会导致堆内存错误吗?最好的办法是什么?
谢谢您

svmlkihl

svmlkihl1#

注意:你的问题是“这是一个好的设计模式吗?”。
如果您必须执行10000000个cassandra数据请求,那么您的数据结构不正确。最终,您应该从头开始设计数据库,以便只需执行1-2次获取。
当然,如果您有5000个cassandra节点,这可能不是一个大问题(可能仍然是),但它仍然散发着糟糕的数据库设计的味道。我认为解决办法是看看你的模式。

8nuwlpux

8nuwlpux2#

我发现您的代码存在以下问题:
过载的cassandra集群,它将无法处理如此多的异步请求,并且您的请求将失败,并出现nohostavailableexception
由于cassadra驱动程序过载,您的客户端应用程序将因io异常而失败,因为系统将无法处理如此多的异步请求(请参阅有关连接优化的详细信息)https://docs.datastax.com/en/developer/java-driver/3.1/manual/pooling/)
是的,内存问题是可能的。这取决于数据大小
可能的解决方案是限制异步请求的数量,并按块处理数据

相关问题