Cassandra、Java和许多异步请求:这样好吗?

Cassandra、Java和许多异步请求:这样好吗?,java,asynchronous,cassandra,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 3

我正在用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行)。我有一个
myListIds
stringid
要迭代。我可以使用:

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);
    }
List futures=new ArrayList();
Map Map=newhashmap();
//映射:key=id&value=来自Cassandra的数据
用于(字符串id:MyListId)
{
ResultSetFuture ResultSetFuture=session.executeAsync(statement.bind(id));
put(id,resultSetFuture);
}
然后我将使用
getunterruptibly()
方法处理我的数据

这里是我的问题:我正在做可能超过10000000个Casandra请求(每个“id”一个请求)。我把所有这些结果放在一张地图里

这会导致堆内存错误吗?最好的办法是什么

谢谢

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

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


当然,如果您有5000个cassandra节点,这可能不是一个大问题(可能仍然是),但它仍然散发着糟糕的数据库设计的气味。我认为解决方案是查看您的模式。

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

  • 过载的Cassandra集群将无法处理如此多的异步请求,并且您的请求将因NoHostAvailableException而失败
  • 过载的cassadra驱动程序,您的客户端应用程序将因IO异常而失败,因为系统将无法处理如此多的异步请求。(请参阅有关连接调优的详细信息)
  • 是的,内存问题是可能的。这取决于数据大小

  • 可能的解决方案是限制异步请求的数量,并按块处理数据。(例如,请参阅)

    听起来像是一个让您产生大量开销的解决方案。我想知道,如果以某种方式处理1K ID是否更有意义。处理数以百万计的请求肯定会产生大量的开销。你应该弄清楚你到底需要什么。你需要你创建的
    地图
    ,还是只是一个你以后会扔掉的中间对象?您是否需要一起处理所有数据,或者可以成批处理,甚至一个一个?