node.js - 使用nodejs对cassandra表上100,000个用户的记录应用更新查询。连接繁忙问题

标签 node.js cassandra es6-promise

我正在使用 cassandra 3.x 和 Node 10.13.0。我的工作内存中有 100,000 个用户的数据(在给定代码中的 map “sortedRowMap”中)。我通过迭代用户使用的 map (有 100,000 条记录)来更新所有记录。但它给我带来了 BusyConnectionError 。我想知道我怎样才能摆脱这个困境。

下面是上述描述的实现代码。

var cassClient = new cassandra.Client({contactPoints: ['localhost'],pooling: {
    coreConnectionsPerHost: {
        [distance.local] : 2,
        [distance.remote] : 1
    },
}, keyspace: 'xyz',
    socketOptions: { readTimeout: 65000 }
});

rank = 0;

for (const [msisdn, totalearnings] of sortedRowMap) {

     let updateRankQuery = "UPDATE users SET weeklyrank = " + rank + " WHERE 
     msisdn = " + msisdn;

     cassClient.execute(updateRankQuery, function (error, result) {
            if(!error){
                rank++;
                console.log("updateQuery: " + updateRankQuery)

            }else{
                console.log("ERROR: " + error)
            }
        })

}

它向我抛出了这个错误:

错误:NoHostAvailableError:尝试查询的所有主机均失败。第一个尝试的主机,127.0.0.1:9042: BusyConnectionError: 到主机 127.0.0.1:9042 的所有连接都忙,每个连接上有 2048 个请求正在进行。请参阅内部错误。

最佳答案

您需要增加每个连接的正在进行的请求数。协议(protocol)版本 3+ 支持最多 32k 正在进行的请求。您需要将相应的选项( maxRequestsPerConnection )添加到 pooling 对象中,如下所示:

pooling: {
    coreConnectionsPerHost: {
        [distance.local] : 2,
        [distance.remote] : 1
    },
    maxRequestsPerConnection: 32768
}

但是,如果您的所有请求都访问相同的 Node ,您仍然可能会遇到此异常。在这种情况下,您需要限制您的提交,或重试

另请参阅相应的section in DataStax Development Guide .

关于node.js - 使用nodejs对cassandra表上100,000个用户的记录应用更新查询。连接繁忙问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54301968/

相关文章:

cassandra - 如何在cassandra中存储微秒级时间戳?

javascript - 解析 json 数组中的所有 promise - javascript

node.js - 在node.js中检索pdf的POST请求

cassandra - 如何更改 yum 安装位置?

c# - 使用 Datastax Cassandra .NET 客户端创建表

javascript - 流畅的异步 api 与 ES6 代理 javascript

javascript - 改进处理 promise 内部回调的方法

javascript - 从 MongoDB 和 Mongoose 中的多个文档创建单个文档

javascript - NodeJS fs.open 在现有文件上失败(不是路径问题)

node.js - Mongoose 数组对象中的数字递增