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

时间:2018-12-20 15:01:08

标签: 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

我的表有很多行(超过50,000,000)。我有一个myListIds的一个String 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()方法处理数据。

这是我的问题:我正在执行超过10,000,000个Casandra请求(每个“ id”请求一个)。我将所有这些结果放入地图中。

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

谢谢

2 个答案:

答案 0 :(得分:5)

注意:您的问题是“这是一种好的设计模式”。

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

现在,当然,如果您有5000个cassandra节点,这可能不是一个大问题(可能仍然是),但是它仍然存在不良数据库设计的麻烦。我认为解决方案是看一下您的架构。

答案 1 :(得分:0)

我发现您的代码存在以下问题:

  1. 重载的Cassandra集群,它将无法处理这么多异步请求,并且您的请求将因NoHostAvailableException而失败
  2. 重载的cassadra驱动程序,您的客户端应用将因IO异常而失败,因为系统将无法处理这么多异步请求。(请参阅有关连接调整https://docs.datastax.com/en/developer/java-driver/3.1/manual/pooling/的详细信息)
  3. 是的,可能出现内存问题。这取决于数据大小

可能的解决方案是按块限制异步请求和处理数据的数量。(例如,参见this answer