【问题标题】:Gremlin server withRemote connection closed - how to reconnect automatically?Gremlin 服务器关闭远程连接 - 如何自动重新连接?
【发布时间】:2017-09-24 03:27:18
【问题描述】:

我正在使用withRemote 将我的 java 应用程序连接到在 AWS 中运行的 gremlin 服务器,并带有 dynamodb 存储后端。几秒后(约 3.3 秒)我连接超时:

org.apache.tinkerpop.gremlin.process.remote.RemoteConnectionException: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.nio.channels.ClosedChannelException]]

我需要弄清楚如何重新连接,这意味着检测连接是否关闭。我不确定如何检测到这一点。当我使用图遍历时出现上述异常,有没有办法在之前发现它并重新连接,或者配置中是否有一个选项允许自动重新连接(比如在这个关闭之前创建新连接)所以我的应用程序总是连接?

如果您需要,这就是我进行连接的方式 - 当前连接部分在应用程序启动时是单例的:

  this.graph = EmptyGraph.instance();
  GryoMessageSerializerV1d0 gryoMessageSerializerV1d0 = new GryoMessageSerializerV1d0(
        GryoMapper.build().addRegistry(JanusGraphIoRegistry.getInstance()));
  this.cluster = Cluster.build().serializer(gryoMessageSerializerV1d0)
        .addContactPoint(configuration.getString("graphDb.host", "localhost"))
        .port(configuration.getInt("graphDb.port", 8182)).create();
  this.graphTraversalSource = this.graph.traversal().withRemote(DriverRemoteConnection.using(cluster));

【问题讨论】:

  • 我会首先尝试弄清楚为什么会发生连接丢失。另外,我正在删除 DynamoDB 标记,因为问题与它无关。
  • 我知道为什么我的连接丢失了。我将 AWS 负载均衡器 TCP 理想超时设置为 60 秒,并且我的大多数 gremlin 调用都在创建数据而没有从 gremlin 服务器返回任何内容,因此它超时了。在发出任何 gremlin 请求之前,我仍然需要弄清楚如何检查连接是否仍然处于活动状态,如果它不处于活动状态则重新连接 - 有人知道如何检查吗?
  • 嗨@monali01 甚至我在我的java应用程序中面临同样的问题我正在做 his.graphTraversalSource = this.graph.traversal().withRemote(DriverRemoteConnection.using(cluster)); // g.V().addV()..... 请求 this.graphTraversalSource.close() 这个循环。就像你以前做的那样。您能否分享解决方案以及您是如何解决问题的。提前致谢。

标签: java gremlin tinkerpop3 janusgraph


【解决方案1】:

我觉得这个问题已经用connection.keepAlive configuration option 解决了。它默认为 180 秒,因此它比负载均衡器中 60 秒的超时时间长,这就是它放弃的原因。

也就是说,驱动程序应该自行重新连接。考虑到connectionPool.reconnectInterval,它一直在尝试这样做,但也许有一种情况是你很快就会耗尽所有连接到出现该错误的地步……不确定。无论哪种方式,希望

【讨论】:

  • " 但也许存在这样一种情况,即您很快就会耗尽所有连接,直到出现该错误” - 总共允许多少个连接?另外,我注意到的另一件事是,如果我对每个请求使用不同的连接,它会上升到 ~1869 个连接,然后服务器开始抛出这个异常:[gremlin-server-boss-1] WARN io.netty.channel.DefaultChannelPipeline - An exceptionCaught( ) 事件被触发,并到达管道的尾部。这通常意味着管道中的最后一个处理程序没有处理异常。 java.io.IOException: 打开的文件太多
  • this.graphTraversalSource = this.graph.traversal().withRemote(DriverRemoteConnection.using(cluster)); // g.V().addV()..... 请求 this.graphTraversalSource.close() this.graphTraversalSource = this.graph.traversal().withRemote(DriverRemoteConnection.using(cluster)); // g.V().addV().....请求this.graphTraversalSource.close()等循环
  • 我不知道可以允许多少个,我只是说您的客户端连接池配置的任何内容都可能已用尽。 “打开的文件太多”是一个相当常见的 linux 错误——如果你在 google 中搜索这个短语,你会得到一堆解决方案。不过,当我在该评论中查看您的代码时,我可以看到为什么服务器显示了如此多的打开连接。没有必要像那样一遍又一遍地重新创建TraversalSource。只需执行一次 - g = graph.traversal().withRemote(...) 并重复使用 g
  • 我本来就是这样的,但是一旦我解决了连接超时问题,我就能够处理更多请求(~1000),然后什么也没有发生——没有错误,最终 gremlin-server 崩溃并我在服务器日志或我添加“TRACE”级别日志的 java 应用程序中没有看到任何错误。有几次,服务器没有崩溃但它没有发送请求,也许它没有找到连接?我确实看到了与保持连接活动相关的消息 - 请求发送到服务器以保持连接 {host=***}} 活动和响应 - 收到来自保持活动请求的响应
  • 您交给withRemote()Cluster 对象将对不同服务器的请求进行轮询,尽管您也可以在Gremlin 服务器前面放置一个负载均衡器(这是一种相当常见的模式)。
猜你喜欢
  • 2018-05-11
  • 2013-08-09
  • 1970-01-01
  • 2023-03-25
  • 2018-10-06
  • 1970-01-01
  • 2015-06-27
  • 2016-01-22
  • 2011-08-25
相关资源
最近更新 更多