Aerospike 在默认连接错误之前工作正常 1 - 4 小时

Aerospike works ok for 1 - 4 hours before defaulting to a connection error

我已经使用 Aerospike Node.js 客户端一段时间了,我注意到如果我 运行 服务器超过两个小时,如果我进行连接调用到 Aerospike 数据库,我收到以下错误:

ERROR(23159) [connect.cc:69] [Connect] - Connecting to Cluster Failed

在此之前,执行很顺利,没有任何障碍。我将 Aerospike 与 Express 结合使用来存储和检索用户内容。这是我写的端点之一

app.get("/api/content/:id",function(req,res){
    aero.client(aeroSec.generateConfig()).connect(function(err, db){
        if(err.code != aero.status.AEROSPIKE_OK)  return res.status(403).send();
        var options = {};
        options.filters = [filter.equal("secindex", req.params.id)];
        var query = db.query("ns","posts",options);
        var data;
        var count = 0;
        var s = query.execute();
        s.on("data",function(rec){
           data = rec;
        });
        s.on("error",function(err){
            data = err;    
        });
        s.on("end",function(){
           db.close();
           if(data == undefined) res.status(404).send("NOTHING FOUND");
           else res.status(200).send(data);
        });   
    });
  });

为了全面披露,我没有查询不存在的索引。在 Aerospike 论坛中进行的搜索建议我将 db.close() 注释掉我的端点,这只会减慢问题的速度而不会消除它。当我连接到另一台服务器上托管的 Aerospike 数据库时,错误开始发生,所以我决定查询本地服务器,而不是在正常运行两个小时后发现相同的错误。

有人知道怎么办吗?我真的很喜欢 Aerospike 作为数据库,但如果这些问题仍然存在,我将别无选择,只能转向另一个 NoSQL 数据库。

代码片段显示应用程序创建了与收到的请求数一样多的客户端对象。常见的用法是,创建一个单一的客户端对象,并为与 Aerospike 服务器的所有通信共享。另一个说明是,client.connect() 是一个同步的 API 调用。 node.js 中有一个使用 express 和 Aerospike 的示例 Web 应用程序。这里是link。请参阅此处以获得更多说明。

上面的代码可以这样重构

 var aerospike = require('aerospike');
 var express   = require('express');
 var app       = express();
 var aerospikeConfig = {
      // add a node in the cluster.
      hosts: [{addr: "192.168.0.1", port: 3000 }] 
 }  
 var client = aerospike.client(aerospikeConfig);
 // client.connect() is a synchronous API call.
 client.connect(function(err, client) {
    if(err.code != aerospike.status.AEROSPIKE_OK) {
        // application should exit or re-attempt the connect call.
        // If connect call fails, connection with Aerospike server is
        // is not established. Subsequent aerospike API calls will fail.
        return err; 
    }
 });

app.get("/api/content/:id",function(req,res){
    var options = {};
    options.filters = [filter.equal("secindex", req.params.id)];
    var query = client.query("ns","posts",options);
    var data;
    var count = 0;
    var s = query.execute();
    s.on("data",function(rec){
       data = rec;
    });
    s.on("error",function(err){
        data = err;    
    });
    s.on("end",function(){
       client.close();
       if(data == undefined) res.status(404).send("NOTHING FOUND");
       else res.status(200).send(data);
    });   
});

谢谢