Cassandra,Java和MANY异步请求:这样好吗?

Ant*_*arf 3 java asynchronous cassandra

我正在用我的表开发一个带有Cassandra的Java应用程序:

id  | registration | name 
 1          1         xxx
 1          2         xxx
 1          3         xxx
 2          1         xxx
 2          2         xxx
...        ...        ...
...        ...        ...
100,000    34        xxx
Run Code Online (Sandbox Code Playgroud)

我的表行数非常多(超过50,000,000).我有一个myListIdsString id遍历.我可以用:

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

但这是一个糟糕的模式.所以我用这种方式使用异步请求:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

然后我将使用getUninterruptibly()方法处理我的数据.

这是我的问题:我做的可能超过10,000,000 Casandra请求(每个'id'一个请求).我将所有这些结果放在Map中.

这会导致堆内存错误吗?处理这个问题的最佳方法是什么?

谢谢

Chu*_*ker 5

注意:你的问题是"这是一个很好的设计模式".

如果您不得不执行10,000,000个cassandra数据请求,那么您的数据结构不正确.最终,您应该从头开始设计数据库,这样您只需要执行1-2次提取.

现在,如果你有5000个cassandra节点,这可能不是一个大问题(它可能仍然是),但它仍然是糟糕的数据库设计.我认为解决方案是看看你的架构.