首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在尝试执行图形查询时来自nodejs驱动程序的dse图连接超时

在尝试执行图形查询时来自nodejs驱动程序的dse图连接超时
EN

Stack Overflow用户
提问于 2017-03-28 11:06:30
回答 2查看 359关注 0票数 1

我在玩DSE Enterprise的最后一个版本。我对图形特征很感兴趣。目前,我有一个项目运行在Titan上,这个开源图形数据库启发了DSE图,我试图将DSE图作为替代数据库进行评估,因为Titan缺少许多管理和操作功能。

我的问题是:

在使用nodejs驱动程序在datastax集群上执行图形查询时,我有一个奇怪的行为。查询正在工作(我可以添加或删除顶点),但是在客户端(nodejs驱动程序),在5到7秒之后,我总是会得到一个连接超时错误,如下所示:

代码语言:javascript
复制
 {
    "statusCode": 200,
    "body": {
        "info": {
            "queriedHost": "xx.xx.xx.xx:9042",
            "triedHosts": {
                "xx.xx.xx.xx:9042": {
                    "message": "Connection timeout",
                    "info": "Cassandra Driver Error"
                }
            },
            "achievedConsistency": 10
        },
        "length": 1,
        "pageState": null
    }
}

但是,当我查看datastax时,我的查询是有效的。我能看到新增加的顶点..。

下面是调用dse图的代码:

代码语言:javascript
复制
'use strict';

const dse = require('dse-driver');
const dseGraph = require('dse-graph');
const client = new dse.Client({
  contactPoints: ['xx.xx.xx.xx'] ,
  protocolOptions: {port: 9042},
  authProvider: new     dse.auth.DsePlainTextAuthProvider("xxx","xxx"),
  graphOptions: { name: 'test' }
});


module.exports.create = (event, context, callback) => {
  let response = {
    statusCode: 200
  };
  client.executeGraph("graph.addVertex(label,'user','email','c@b');").then(function(users) {
    response.body=users;
    client.shutdown();
    callback(null, response);
  }).catch(function(err) {    
    response.statusCode=400;
    response.body=err;
    client.shutdown();
    callback(null, response);
  });
};

可能是我的集群配置出现了问题吗?

以下是我的拓扑结构:

  • 单簇
    • 3个数据中心
    • 图的一个数据中心,有两个节点
    • 1个数据中心,用于搜索,有1个节点
    • 1个数据中心,用于分析,有1个节点

所有设置都是默认设置。我已经通过OpsCenter安装了集群,我的所有节点都是ec2实例(m4.xlarge)。

您知道查询为什么会工作吗?但是我在成功回调中得到了一条奇怪的消息?

致以敬意,

图基基扎耶德

EN

回答 2

Stack Overflow用户

发布于 2017-03-28 13:20:00

作为在文档中注明,您不应该在每个查询执行之后调用关机。

通常,每个应用程序都应该使用一个Client实例。您应该在应用程序中的模块之间共享该实例。

您应该只在应用程序生命周期中调用client.shutdown()一次,通常是在关闭应用程序时。

票数 0
EN

Stack Overflow用户

发布于 2017-03-28 22:11:17

感谢Jorge帮助,我添加了这一行来记录驱动程序收到的所有事件:

client.on('log',console.log)

我在日志中注意到,当我调用EC2服务器的公共地址时(因为我的客户端在VPC之外),节点试图使用它们之间的私有接口进行通信。公共和私人地址的混合造成了这个问题。

这就是我所做的,它解决了问题,但我不知道这是否是正确的答案。

我修改了每个节点上的cassandra.yaml文件,并将broadcast_rpc_address设置为每个实例的公共地址。

现在我的疑问已经开始运作了。

唯一剩下的问题是:是否有更好的方法使用Cassandra来处理公共和私有IP的混合?

通过将broadcast_rpc_address设置为EC2实例的公共IP,我是否做错了什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43067912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档