2017-09-24 4 views
2

Dynamo 스토리지 백엔드를 사용하여 AWS에서 실행중인 gremlin 서버에 Java 응용 프로그램을 연결하려면 withRemote을 사용하고 있습니다. 나는 몇 초 (~ 3.3 초) 후 연결 시간 제한을 얻고있다 : 나는 연결이 닫혀있는 경우 감지 의미 다시 연결하는 방법을 알아낼 필요가Gremlin 서버 with 리모콘 연결이 닫혔습니다 - 자동으로 다시 연결하는 방법?

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

. 나는 그것을 어떻게 감지 할 지 모르겠다. 그래프 탐색을 사용할 때 위의 예외가 발생합니다. 이전에 발견하고 다시 연결하는 방법이 있습니까? 또는 구성을 자동으로 다시 연결할 수있는 옵션이 있습니까 (예 :이 연결이 닫히기 전에 새 연결 만들기). 그래서 내 응용 프로그램이 항상 연결되어 있습니까? 이 문제가 이미 connection.keepAliveconfiguration option 해결할처럼

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)); 
+1

내가 연결 손실이 발생하는 이유를 먼저 파악하려고합니다. 또한 문제는 DynamoDB 태그와 관련이 없으므로 DynamoDB 태그를 제거합니다. –

+0

연결이 끊어지는 이유를 알았습니다. AWS로드 밸런서 TCP의 이상적인 시간 초과를 60 초로 설정했으며 대부분의 gremlin 호출은 gremlin 서버에서 아무 것도 반환하지 않고 데이터를 생성하므로 시간이 초과되었습니다. 그래도 gremlin 요청을하기 전에 연결이 여전히 활성화되어 있는지 확인하는 방법을 알아야하며, 활성화되어 있지 않으면 다시 연결해야합니다. – monali01

답변

2

내 기분 : 응용 프로그램이 시작될 때 현재 연결 부분은 싱글입니다 - 당신이 필요로하는 경우

이 내가 연결을하고있는 중이 야 방법이다. 기본 설정은 180 초이므로로드 밸런서의 시간 제한 인 60 초보다 길어서 포기하는 것입니다.

즉, 드라이버가 자체적으로 다시 연결되어야한다고 말했습니다. connectionPool.reconnectInterval이 주어지면 끊임없이 노력하고 있습니다.하지만 오류가 발생하는 지점까지 모든 연결을 빠르게 소모하는 상황이있을 수 있습니다. 확실하지 않습니다. 어느 쪽이든, 잘하면

+0

"하지만 아마도 그 오류를 얻는 지점까지 모든 연결을 빠르게 소모하고있는 상황이 있습니다."- 얼마나 많은 총 연결이 허용됩니까? 요청마다 다른 연결을 사용하면 또 다른 사실을 발견했습니다. 최대 1869 개의 ​​연결로 이어지고 서버가이 예외를 throw하기 시작했습니다. [gremlin-server-boss-1] WARN io.netty.channel.DefaultChannelPipeline - An exceptionCaught() 이벤트가 발생하여 파이프 라인의 끝에 도달했습니다. 일반적으로 파이프 라인의 마지막 핸들러가 예외를 처리하지 못했음을 의미합니다. java.io.IOException : 열려있는 파일이 너무 많습니다. – monali01

+0

this.graphTraversalSource = this.graph.traversal(). withRemote (DriverRemoteConnection.using (cluster)); // g.V(). addV() ..... request this.graphTraversalSource.close() this.graphTraversalSource = this.graph.traversal(). withRemote (DriverRemoteConnection.using (cluster)); 는 // GV(). ADDV() ..... 요청 this.graphTraversalSource.close는() 등 루프 – monali01

+1

에 내가 허용 할 수 있습니다 얼마나 많은 모른다, 나는 단지 의미가 무엇 이건 당신의 에 대한 클라이언트 연결 풀 구성이 고갈되었을 수 있습니다. "너무 많은 파일 열기"는 꽤 흔한 리눅스 오류입니다. Google에서 해당 문구를 검색하면 여러 가지 해결책을 얻을 수 있습니다. 내가 그 코멘트에서 귀하의 코드를 보면, 나는 왜 서버가 너무 많은 열린 연결을 보여주고 있는지 알 수 있습니다. 그런 'TraversalSource'를 계속해서 다시 만들 필요가 없습니다. 한번만'g = graph.traversal(). withRemote (...)'하고'g'를 다시 사용하십시오. –